iwa 0.0.15__tar.gz → 0.0.16__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.15/src/iwa.egg-info → iwa-0.0.16}/PKG-INFO +1 -1
- {iwa-0.0.15 → iwa-0.0.16}/pyproject.toml +2 -2
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/constants.py +13 -3
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/activity_checker.py +19 -6
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/mech.py +84 -2
- {iwa-0.0.15 → iwa-0.0.16/src/iwa.egg-info}/PKG-INFO +1 -1
- {iwa-0.0.15 → iwa-0.0.16}/LICENSE +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/README.md +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/setup.cfg +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/__main__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/errors.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/interface.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/manager.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/chain/rate_limiter.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/cli.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/constants.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/abis/erc20.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/abis/multisend.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/abis/multisend_call_only.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/contract.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/erc20.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/contracts/multisend.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/db.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/ipfs.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/keys.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/mnemonic.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/monitor.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/plugins.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/pricing.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/secrets.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/account.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/balance.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/plugin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/safe.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transaction.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/base.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/erc20.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/multisend.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/native.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/services/transfer/swap.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/tables.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/test.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/tests/test_wallet.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/types.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/ui.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/utils.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/core/wallet.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/cow/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/cow/quotes.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/cow/swap.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/cow/types.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/cow_utils.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/plugin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/safe.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/tests/test_cow.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/gnosis/tests/test_safe.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/activity_checker.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/mech.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/mech_marketplace.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/mech_new.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/service_manager.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/service_registry.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/service_registry_token_utility.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/staking.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/abis/staking_token.json +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/base.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/mech.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/mech_marketplace.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/contracts/staking.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/importer.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/mech_reference.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/plugin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/scripts/test_full_mech_flow.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/scripts/test_simple_lifecycle.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/base.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/drain.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/lifecycle.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/service_manager/staking.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/conftest.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_importer.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_importer_error_handling.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_mech_contracts.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_contracts.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_integration.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_view.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_view_actions.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_olas_view_modals.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_plugin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_plugin_full.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_lifecycle.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager_errors.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager_flows.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager_mech.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager_rewards.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_manager_validation.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_service_staking.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_staking_integration.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tests/test_staking_validation.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tui/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/plugins/olas/tui/olas_view.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/check_profile.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/list_contracts.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/release.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/reset_env.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/reset_tenderly.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/restore_backup.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tools/wallet_check.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/app.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/modals/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/modals/base.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/rpc.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/screens/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/screens/wallets.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/tests/test_app.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/tests/test_rpc.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/tests/test_wallets_refactor.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/tests/test_widgets.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/widgets/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/widgets/base.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/tui/workers.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/dependencies.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/accounts.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/__init__.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/admin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/funding.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/general.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/services.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/olas/staking.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/state.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/swap.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/routers/transactions.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/server.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/static/app.js +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/static/index.html +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/static/style.css +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/tests/test_web_endpoints.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/tests/test_web_olas.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/tests/test_web_swap.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa/web/tests/test_web_swap_coverage.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa.egg-info/SOURCES.txt +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa.egg-info/dependency_links.txt +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa.egg-info/entry_points.txt +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa.egg-info/requires.txt +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/iwa.egg-info/top_level.txt +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_cow.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_safe.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_transaction_retry_logic.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_tui.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_wallets_screen.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/legacy_web.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_account_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_balance_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_chain.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_chain_interface.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_chain_interface_coverage.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_cli.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_contract.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_db.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_drain_coverage.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_erc20.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_gnosis_plugin.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_keys.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_legacy_wallet.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_main.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_migration.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_mnemonic.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_modals.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_models.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_monitor.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_multisend.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_plugin_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_pricing.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_rate_limiter.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_reset_tenderly.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_rpc_rotation.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_rpc_view.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_safe_coverage.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_safe_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_service_manager_integration.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_service_manager_structure.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_service_transaction.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_staking_router.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_staking_simple.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_tables.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transaction_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transfer_multisend.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transfer_native.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transfer_security.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transfer_structure.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_transfer_swap_unit.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_ui_coverage.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_utils.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tests/test_workers.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/src/tools/create_and_stake_service.py +0 -0
- {iwa-0.0.15 → iwa-0.0.16}/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.16"
|
|
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.16"
|
|
75
75
|
fix = true
|
|
76
76
|
|
|
77
77
|
[tool.ruff.lint]
|
|
@@ -51,11 +51,21 @@ OLAS_CONTRACTS: Dict[str, Dict[str, EthereumAddress]] = {
|
|
|
51
51
|
"0xa45E64d13A30a51b91ae0eb182e88a40e9b18eD8"
|
|
52
52
|
),
|
|
53
53
|
"OLAS_SERVICE_MANAGER": EthereumAddress("0x068a4f0946cF8c7f9C1B58a3b5243Ac8843bf473"),
|
|
54
|
-
# Legacy mech - used by TRADER staking contracts
|
|
54
|
+
# Legacy mech - used by NON-MM TRADER staking contracts (e.g., "Expert X (Yk OLAS)")
|
|
55
|
+
# Activity checker calls agentMech.getRequestsCount(multisig) to count requests.
|
|
55
56
|
"OLAS_MECH": EthereumAddress("0x77af31De935740567Cf4fF1986D04B2c964A786a"),
|
|
56
|
-
# NEW Marketplace (v2) -
|
|
57
|
+
# NEW Marketplace (v2) - used by MM staking contracts (e.g., "Expert X MM (Yk OLAS)")
|
|
58
|
+
# Services staked in "Expert X MM" contracts MUST use marketplace requests.
|
|
59
|
+
# Legacy mech requests will NOT be counted by the activity checker.
|
|
57
60
|
"OLAS_MECH_MARKETPLACE": EthereumAddress("0x735FAAb1c4Ec41128c367AFb5c3baC73509f70bB"),
|
|
58
|
-
#
|
|
61
|
+
# Default priority mech for marketplace requests (from olas-operate-middleware)
|
|
62
|
+
# This is the mech that will process requests sent via the marketplace.
|
|
63
|
+
# Source: https://github.com/valory-xyz/olas-operate-middleware/blob/main/operate/ledger/profiles.py
|
|
64
|
+
# DEFAULT_PRIORITY_MECH["0x735FAAb1c..."] = ("0xC05e7412...", 2182)
|
|
65
|
+
"OLAS_MECH_MARKETPLACE_PRIORITY": EthereumAddress(
|
|
66
|
+
"0xC05e7412439bD7e91730a6880E18d5D5873F632C"
|
|
67
|
+
),
|
|
68
|
+
# OLD Marketplace (v1) - legacy, kept for reference
|
|
59
69
|
"OLAS_MECH_MARKETPLACE_OLD": EthereumAddress("0x4554fE75c1f5576c1d7F765B2A036c199Adae329"),
|
|
60
70
|
},
|
|
61
71
|
"ethereum": {
|
|
@@ -43,14 +43,27 @@ class ActivityCheckerContract(ContractInstance):
|
|
|
43
43
|
"""
|
|
44
44
|
super().__init__(address, chain_name=chain_name)
|
|
45
45
|
|
|
46
|
-
#
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
# Check for marketplace-aware checker
|
|
47
|
+
try:
|
|
48
|
+
mech_mp_function = getattr(self.contract.functions, "mechMarketplace", None)
|
|
49
|
+
self.mech_marketplace = mech_mp_function().call() if mech_mp_function else None
|
|
50
|
+
except Exception:
|
|
51
|
+
self.mech_marketplace = None
|
|
52
|
+
|
|
53
|
+
# Get the mech address this checker tracks (legacy or priority mech)
|
|
54
|
+
try:
|
|
55
|
+
agent_mech_function = getattr(self.contract.functions, "agentMech", None)
|
|
56
|
+
self.agent_mech = (
|
|
57
|
+
agent_mech_function().call() if agent_mech_function else DEFAULT_MECH_CONTRACT_ADDRESS
|
|
58
|
+
)
|
|
59
|
+
except Exception:
|
|
60
|
+
self.agent_mech = DEFAULT_MECH_CONTRACT_ADDRESS
|
|
51
61
|
|
|
52
62
|
# Get liveness ratio (requests per second * 1e18)
|
|
53
|
-
|
|
63
|
+
try:
|
|
64
|
+
self.liveness_ratio = self.contract.functions.livenessRatio().call()
|
|
65
|
+
except Exception:
|
|
66
|
+
self.liveness_ratio = 0
|
|
54
67
|
|
|
55
68
|
def get_multisig_nonces(self, multisig: EthereumAddress) -> Tuple[int, int]:
|
|
56
69
|
"""Get the nonces for a multisig address.
|
|
@@ -1,4 +1,29 @@
|
|
|
1
|
-
"""Mech manager mixin.
|
|
1
|
+
"""Mech manager mixin.
|
|
2
|
+
|
|
3
|
+
This module handles sending mech requests for OLAS services. There are TWO
|
|
4
|
+
distinct flows for mech requests, and the correct one MUST be used based on
|
|
5
|
+
the service's staking contract:
|
|
6
|
+
|
|
7
|
+
1. **Legacy Mech Flow** (use_marketplace=False):
|
|
8
|
+
- Sends requests directly to the legacy mech contract (0x77af31De...)
|
|
9
|
+
- Used by NON-MM staking contracts (e.g., "Expert X (Yk OLAS)")
|
|
10
|
+
- Activity checker calls `agentMech.getRequestsCount(multisig)` to count
|
|
11
|
+
|
|
12
|
+
2. **Marketplace Flow** (use_marketplace=True):
|
|
13
|
+
- Sends requests via MechMarketplace contract (0x735FAAb1c...)
|
|
14
|
+
- Used by MM staking contracts (e.g., "Expert X MM (Yk OLAS)")
|
|
15
|
+
- Activity checker calls `mechMarketplace.mapRequestCounts(multisig)` to count
|
|
16
|
+
- Requires a priority_mech that is registered on the marketplace
|
|
17
|
+
- Default priority_mech from olas-operate-middleware: 0xC05e7412...
|
|
18
|
+
|
|
19
|
+
**IMPORTANT**: If a service is staked in an MM contract but sends legacy mech
|
|
20
|
+
requests, those requests will NOT be counted by the activity checker, and the
|
|
21
|
+
service will not receive staking rewards.
|
|
22
|
+
|
|
23
|
+
The `get_marketplace_config()` method automatically detects which flow to use
|
|
24
|
+
by checking if the staking contract's activity checker has a `mechMarketplace`
|
|
25
|
+
field set to a non-zero address.
|
|
26
|
+
"""
|
|
2
27
|
|
|
3
28
|
from typing import Optional
|
|
4
29
|
|
|
@@ -17,12 +42,60 @@ from iwa.plugins.olas.contracts.mech_marketplace import MechMarketplaceContract
|
|
|
17
42
|
class MechManagerMixin:
|
|
18
43
|
"""Mixin for Mech interactions."""
|
|
19
44
|
|
|
45
|
+
def get_marketplace_config(self) -> tuple:
|
|
46
|
+
"""Check if current service requires marketplace mech requests.
|
|
47
|
+
|
|
48
|
+
Queries the staking contract's activityChecker to determine if it
|
|
49
|
+
tracks marketplace requests.
|
|
50
|
+
|
|
51
|
+
Returns:
|
|
52
|
+
Tuple of (use_marketplace, marketplace_address, priority_mech):
|
|
53
|
+
- use_marketplace: True if marketplace requests are required.
|
|
54
|
+
- marketplace_address: Address of the mech marketplace (if applicable).
|
|
55
|
+
- priority_mech: Address of the priority mech (if applicable).
|
|
56
|
+
|
|
57
|
+
"""
|
|
58
|
+
from iwa.core.constants import ZERO_ADDRESS
|
|
59
|
+
|
|
60
|
+
if not self.service or not self.service.staking_contract_address:
|
|
61
|
+
return (False, None, None)
|
|
62
|
+
|
|
63
|
+
try:
|
|
64
|
+
# Get staking contract with its activity checker
|
|
65
|
+
from iwa.plugins.olas.contracts.staking import StakingContract
|
|
66
|
+
|
|
67
|
+
staking = StakingContract(
|
|
68
|
+
self.service.staking_contract_address, chain_name=self.chain_name
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
# StakingContract has activity_checker attribute set in __init__
|
|
72
|
+
checker = staking.activity_checker
|
|
73
|
+
|
|
74
|
+
if checker.mech_marketplace and checker.mech_marketplace != ZERO_ADDRESS:
|
|
75
|
+
# Use the default marketplace priority mech from constants
|
|
76
|
+
from iwa.plugins.olas.constants import OLAS_CONTRACTS
|
|
77
|
+
|
|
78
|
+
protocol_contracts = OLAS_CONTRACTS.get(self.chain_name, {})
|
|
79
|
+
priority_mech = protocol_contracts.get("OLAS_MECH_MARKETPLACE_PRIORITY")
|
|
80
|
+
|
|
81
|
+
logger.info(
|
|
82
|
+
f"[MECH] Service {self.service.service_id} requires marketplace requests "
|
|
83
|
+
f"(marketplace={checker.mech_marketplace}, priority_mech={priority_mech})"
|
|
84
|
+
)
|
|
85
|
+
return (True, checker.mech_marketplace, priority_mech)
|
|
86
|
+
|
|
87
|
+
return (False, None, None)
|
|
88
|
+
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.debug(f"[MECH] Failed to detect marketplace config: {e}")
|
|
91
|
+
return (False, None, None)
|
|
92
|
+
|
|
20
93
|
def send_mech_request(
|
|
21
94
|
self,
|
|
22
95
|
data: bytes,
|
|
23
96
|
value: Optional[int] = None,
|
|
24
97
|
mech_address: Optional[str] = None,
|
|
25
|
-
use_marketplace: bool =
|
|
98
|
+
use_marketplace: Optional[bool] = None,
|
|
26
99
|
use_new_abi: bool = False,
|
|
27
100
|
priority_mech: Optional[str] = None,
|
|
28
101
|
max_delivery_rate: Optional[int] = None,
|
|
@@ -37,6 +110,7 @@ class MechManagerMixin:
|
|
|
37
110
|
value: Payment value in wei. For marketplace, should match mech's maxDeliveryRate.
|
|
38
111
|
mech_address: Address of the Mech contract (for legacy/direct flow).
|
|
39
112
|
use_marketplace: Whether to use the Mech Marketplace flow.
|
|
113
|
+
If None, auto-detects based on staking contract.
|
|
40
114
|
use_new_abi: Whether to use new ABI for legacy flow.
|
|
41
115
|
priority_mech: Priority mech address (required for marketplace).
|
|
42
116
|
max_delivery_rate: Max delivery rate in wei (for marketplace). If None, uses value.
|
|
@@ -59,6 +133,14 @@ class MechManagerMixin:
|
|
|
59
133
|
logger.error(f"Service {service_id} has no multisig address")
|
|
60
134
|
return None
|
|
61
135
|
|
|
136
|
+
# Auto-detect marketplace requirement if not explicitly specified
|
|
137
|
+
if use_marketplace is None:
|
|
138
|
+
use_marketplace, detected_marketplace, detected_priority_mech = (
|
|
139
|
+
self.get_marketplace_config()
|
|
140
|
+
)
|
|
141
|
+
if use_marketplace:
|
|
142
|
+
priority_mech = priority_mech or detected_priority_mech
|
|
143
|
+
|
|
62
144
|
if use_marketplace:
|
|
63
145
|
return self._send_marketplace_mech_request(
|
|
64
146
|
data=data,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.15 → iwa-0.0.16}/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
|