ipor-fusion 4.1.1.dev2__tar.gz → 4.2.0.dev9__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.
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/AGENTS.md +11 -3
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/PKG-INFO +6 -2
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/README.md +5 -1
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/pyproject.toml +1 -1
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/skills/ipor-deploy-vault/SKILL.md +14 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/__init__.py +40 -0
- ipor_fusion-4.2.0.dev9/src/ipor_fusion/cli/fuse_cmd.py +108 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/main.py +2 -0
- ipor_fusion-4.2.0.dev9/src/ipor_fusion/fuse_whitelist.py +401 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/guide/invariants.md +12 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/guide/quickstart.md +2 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/mcp/models.py +26 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/mcp/server.py +29 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/preflight.py +42 -1
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/registry.py +15 -2
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/types.py +1 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/validation.py +100 -8
- ipor_fusion-4.2.0.dev9/tests/test_cli_mcp_fuse_whitelist.py +115 -0
- ipor_fusion-4.2.0.dev9/tests/test_fuse_whitelist.py +411 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_preflight.py +7 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_public_api.py +42 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_registry.py +39 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_preflight_base.py +16 -2
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_validation.py +9 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.env.example +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.gemini/settings.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.gitignore +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/.python-version +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/CHANGELOG.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/CLAUDE.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/CODEOWNERS +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/LICENSE +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/MIGRATION_4.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/build.sh +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/README.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/hypercore_vault_official_deployment_hyperevm.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/pytest.ini +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/scripts/fusion_error_signatures.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/address_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/context_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/fuse_decoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/hypercore_pre_hooks.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/fusion_errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/hypercore/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/onchain_text.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/euler_v2.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_addresses.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_event_args.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_foundry.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_golden.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_guide.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_live.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_multicall.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_simulate.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/_validation.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/addresses.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/conftest.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/constants.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/hypercore_official.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_about.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_addresses_helper.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cache.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_ccip_read_disabled.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_chains.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_address.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_mcp_parity.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_preflight.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_examples_hypercore_hyperevm.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_fuse_decoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_fusion_errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_governance_wrappers.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_guide.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_pre_hooks.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_logs.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_address.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_preflight.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_onchain_text.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_roles.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_examples_hyperevm.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_timelock_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.1.1.dev2 → ipor_fusion-4.2.0.dev9}/uv.lock +0 -0
|
@@ -174,7 +174,7 @@ checkout's default profile), the pending reader included.
|
|
|
174
174
|
subpackages do not list them). Their exceptions stay in `errors` and the top
|
|
175
175
|
level. `ipor_fusion.guide` keeps its own namespace. The
|
|
176
176
|
public modules (`about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`,
|
|
177
|
-
`field_docs`, `market_ids`, `market_info`, `morpho_api`, `preflight`, `registry`, `substrates`, `types`,
|
|
177
|
+
`field_docs`, `fuse_whitelist`, `market_ids`, `market_info`, `morpho_api`, `preflight`, `registry`, `substrates`, `types`,
|
|
178
178
|
`validation`, `vault_data`, `vault_info`) stay importable for the names they
|
|
179
179
|
define and the moved names README lists; `cli`, `mcp`, every other module and
|
|
180
180
|
every submodule of a public subpackage (`core.contract`, `fuses.base`, ...) are
|
|
@@ -246,6 +246,13 @@ checkout's default profile), the pending reader included.
|
|
|
246
246
|
`registry.py` the ipor-abi address registry (`fetch_address_registry` →
|
|
247
247
|
`AddressRegistry`, one raw-GitHub file per chain in `REGISTRY_CHAIN_IDS`, cached ten
|
|
248
248
|
minutes in the process, for good at a commit ref) and the `fusion address` documents;
|
|
249
|
+
`fuse_whitelist.py` the on-chain Fuse Whitelist (`IporFusionFuseWhitelistProxy`,
|
|
250
|
+
resolved through `registry.py`): `read_market_fuses` / `read_fuse_entries` in
|
|
251
|
+
Multicall3 batches, `check_fuses` + `fuse_whitelist_issues` (the warnings
|
|
252
|
+
`validate_vault` and `preflight_execute` add, each naming the active
|
|
253
|
+
replacement) and the `fusion fuse whitelist` document; `getFusesByMarketId`
|
|
254
|
+
returns deprecated fuses too, so state is always read alongside; it reads the
|
|
255
|
+
registry with a 5 s timeout and `stale_if_error`, since the check is optional;
|
|
249
256
|
`morpho_api.py` the Morpho public GraphQL API client (`fetch_market`, `fetch_vault`,
|
|
250
257
|
`PUBLIC_ALLOCATOR_ADDRESSES`; it narrows the GraphQL body from `object`);
|
|
251
258
|
`market_info.py` — `build_morpho_blue_market_json`, `build_meta_morpho_json`, the
|
|
@@ -477,7 +484,8 @@ byte, e.g. Ebisu ZAPPER/REGISTRY).
|
|
|
477
484
|
## CLI and MCP
|
|
478
485
|
|
|
479
486
|
`fusion address` (lookup, names, list; the ipor-abi registry through `registry.py`),
|
|
480
|
-
`fusion config` (set-provider, set-etherscan-key, show), `fusion
|
|
487
|
+
`fusion config` (set-provider, set-etherscan-key, show), `fusion fuse`
|
|
488
|
+
(whitelist; the on-chain Fuse Whitelist through `fuse_whitelist.py`), `fusion market`
|
|
481
489
|
(morpho-blue, meta-morpho), `fusion vault` (add, remove, list, info, validate,
|
|
482
490
|
role-accounts, oracle-mapping, preflight). `vault info` runs independent fetch pipelines
|
|
483
491
|
(vault/asset, fees, WithdrawManager, markets, roles) concurrently on a
|
|
@@ -495,7 +503,7 @@ Every CLI command has an MCP tool (`fusion changelog` maps to `server_info`;
|
|
|
495
503
|
the rest share names). Read-only: `vault_info`, `vault_validate`, `vault_preflight`,
|
|
496
504
|
`vault_list`, `vault_role_accounts`, `vault_oracle_mapping`, `market_morpho_blue`,
|
|
497
505
|
`market_meta_morpho`, `address_lookup`, `address_names`, `address_list`,
|
|
498
|
-
`config_show`, `server_info`. Mutating: `vault_add`,
|
|
506
|
+
`fuse_whitelist`, `config_show`, `server_info`. Mutating: `vault_add`,
|
|
499
507
|
`vault_remove`, `config_set_provider`, `config_set_etherscan_key`. Every new
|
|
500
508
|
CLI command gets a matching MCP tool with the same argument names; an optional
|
|
501
509
|
chain or block is `None` when omitted (`ChainArg`, `BlockArg`); a chain of
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ipor-fusion
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.2.0.dev9
|
|
4
4
|
Summary: The IPOR Fusion SDK for Python
|
|
5
5
|
Project-URL: homepage, https://ipor.io
|
|
6
6
|
Project-URL: repository, https://github.com/IPOR-Labs/ipor-fusion.py
|
|
@@ -251,6 +251,9 @@ fusion market meta-morpho 0xVAULT_ADDRESS --chain ethereum
|
|
|
251
251
|
# Find IPOR Fusion contracts in the ipor-abi registry
|
|
252
252
|
fusion address lookup SupplyFuseAaveV3 --chain base
|
|
253
253
|
fusion address list --chain base
|
|
254
|
+
|
|
255
|
+
# Whitelisted fuses of a market: reuse one instead of deploying a copy
|
|
256
|
+
fusion fuse whitelist --chain arbitrum --market-id 11
|
|
254
257
|
```
|
|
255
258
|
|
|
256
259
|
## MCP Server
|
|
@@ -309,7 +312,7 @@ Available tools:
|
|
|
309
312
|
| `config_set_provider` | Set RPC provider URL for a chain (auto-detects chain ID) |
|
|
310
313
|
| `config_set_etherscan_key` | Set Etherscan API key (enables contract name resolution) |
|
|
311
314
|
| `vault_info` | Full on-chain vault state — assets, fuses, balances, fees, lending health, reconciliation |
|
|
312
|
-
| `vault_validate` | Health verdict (ok / warning / critical) with the reconciliation, lending-health and ERC20 numbers behind it |
|
|
315
|
+
| `vault_validate` | Health verdict (ok / warning / critical) with the reconciliation, lending-health and ERC20 numbers behind it, plus a warning for each fuse not active in the Fuse Whitelist |
|
|
313
316
|
| `vault_preflight` | Check execute calldata as its sender would send it: permission, fuses, balance fuses, simulation |
|
|
314
317
|
| `vault_role_accounts` | Accounts holding each AccessManager role on a vault |
|
|
315
318
|
| `vault_oracle_mapping` | Price-oracle sources per asset for a vault |
|
|
@@ -321,6 +324,7 @@ Available tools:
|
|
|
321
324
|
| `address_lookup` | IPOR Fusion contracts by name substring or address (ipor-abi registry) |
|
|
322
325
|
| `address_names` | Contract names in the registry, with the chains that have them |
|
|
323
326
|
| `address_list` | One chain's full `{name: address}` registry |
|
|
327
|
+
| `fuse_whitelist` | The fuses the chain's Fuse Whitelist lists for a market (active first) |
|
|
324
328
|
|
|
325
329
|
Configure providers and vaults via `fusion config` or the MCP config tools first.
|
|
326
330
|
|
|
@@ -202,6 +202,9 @@ fusion market meta-morpho 0xVAULT_ADDRESS --chain ethereum
|
|
|
202
202
|
# Find IPOR Fusion contracts in the ipor-abi registry
|
|
203
203
|
fusion address lookup SupplyFuseAaveV3 --chain base
|
|
204
204
|
fusion address list --chain base
|
|
205
|
+
|
|
206
|
+
# Whitelisted fuses of a market: reuse one instead of deploying a copy
|
|
207
|
+
fusion fuse whitelist --chain arbitrum --market-id 11
|
|
205
208
|
```
|
|
206
209
|
|
|
207
210
|
## MCP Server
|
|
@@ -260,7 +263,7 @@ Available tools:
|
|
|
260
263
|
| `config_set_provider` | Set RPC provider URL for a chain (auto-detects chain ID) |
|
|
261
264
|
| `config_set_etherscan_key` | Set Etherscan API key (enables contract name resolution) |
|
|
262
265
|
| `vault_info` | Full on-chain vault state — assets, fuses, balances, fees, lending health, reconciliation |
|
|
263
|
-
| `vault_validate` | Health verdict (ok / warning / critical) with the reconciliation, lending-health and ERC20 numbers behind it |
|
|
266
|
+
| `vault_validate` | Health verdict (ok / warning / critical) with the reconciliation, lending-health and ERC20 numbers behind it, plus a warning for each fuse not active in the Fuse Whitelist |
|
|
264
267
|
| `vault_preflight` | Check execute calldata as its sender would send it: permission, fuses, balance fuses, simulation |
|
|
265
268
|
| `vault_role_accounts` | Accounts holding each AccessManager role on a vault |
|
|
266
269
|
| `vault_oracle_mapping` | Price-oracle sources per asset for a vault |
|
|
@@ -272,6 +275,7 @@ Available tools:
|
|
|
272
275
|
| `address_lookup` | IPOR Fusion contracts by name substring or address (ipor-abi registry) |
|
|
273
276
|
| `address_names` | Contract names in the registry, with the chains that have them |
|
|
274
277
|
| `address_list` | One chain's full `{name: address}` registry |
|
|
278
|
+
| `fuse_whitelist` | The fuses the chain's Fuse Whitelist lists for a market (active first) |
|
|
275
279
|
|
|
276
280
|
Configure providers and vaults via `fusion config` or the MCP config tools first.
|
|
277
281
|
|
|
@@ -68,6 +68,18 @@ greppable.
|
|
|
68
68
|
`AaveV3WithPriceOracleMiddlewareBalanceFuse`, Arbitrum only the latter, so a
|
|
69
69
|
name that resolves on one chain may not exist on the next. Resolve
|
|
70
70
|
`(chain, name)` in `ipor-abi`; never reuse an address across chains.
|
|
71
|
+
A registry entry is not a whitelist entry. Before adding or deploying a
|
|
72
|
+
fuse, check the chain's Fuse Whitelist: `fusion fuse whitelist --chain base
|
|
73
|
+
--market-id 11` or the MCP tool `fuse_whitelist` lists a market's active
|
|
74
|
+
fuses. On-chain it is `IporFusionFuseWhitelistProxy` in the same
|
|
75
|
+
`addresses.json`: `getFusesByMarketId(market_id)` returns a market's fuses,
|
|
76
|
+
active and deprecated together, and only those whose
|
|
77
|
+
`getFuseByAddress(fuse)` reports `fuseState` 1 (active) belong in a new
|
|
78
|
+
vault. Use an active fuse when one covers the action. A redeployed or
|
|
79
|
+
forked copy of a whitelisted fuse is never whitelisted, and the IPOR app
|
|
80
|
+
shows its market as unknown; a fuse for an action no active fuse covers
|
|
81
|
+
goes through the whitelist review at
|
|
82
|
+
https://ipor.io/docs/build-on-fusion/integrating-a-new-market.md.
|
|
71
83
|
6. **`.send(ctx)` signs locally and needs a private key in the `Web3Context`;
|
|
72
84
|
`.call(ctx)` previews without one.** Sending through a context built with
|
|
73
85
|
`signer=` alone raises `ValueError("Private key required for sending
|
|
@@ -238,6 +250,8 @@ Resolve fuse addresses by registry name and chain from `ipor-abi`
|
|
|
238
250
|
`fusion address lookup SupplyFuseAaveV3 --chain base`, or the MCP tool
|
|
239
251
|
`address_lookup` (the hosted server's `fusion_address_lookup`). The SDK class
|
|
240
252
|
for a registry name swaps the parts: `SupplyFuseAaveV3` is `AaveV3SupplyFuse`.
|
|
253
|
+
Then confirm the fuse is active in the chain's Fuse Whitelist with
|
|
254
|
+
`fusion fuse whitelist` or the MCP tool `fuse_whitelist` (invariant 5).
|
|
241
255
|
|
|
242
256
|
## Pointers
|
|
243
257
|
|
|
@@ -146,6 +146,26 @@ from ipor_fusion.errors import (
|
|
|
146
146
|
)
|
|
147
147
|
from ipor_fusion.explorer import get_contract_name, get_deployment_tx
|
|
148
148
|
from ipor_fusion.field_docs import DOCS
|
|
149
|
+
from ipor_fusion.fuse_whitelist import (
|
|
150
|
+
FUSE_WHITELIST_READ_ERRORS,
|
|
151
|
+
FUSE_WHITELIST_REGISTRY_NAME,
|
|
152
|
+
FuseIssueKind,
|
|
153
|
+
FuseRole,
|
|
154
|
+
FuseState,
|
|
155
|
+
FuseWhitelist,
|
|
156
|
+
FuseWhitelistCheck,
|
|
157
|
+
FuseWhitelistIssue,
|
|
158
|
+
FuseWhitelistJson,
|
|
159
|
+
WhitelistEntry,
|
|
160
|
+
WhitelistEntryJson,
|
|
161
|
+
build_fuse_whitelist_json,
|
|
162
|
+
check_fuses,
|
|
163
|
+
fetch_fuse_whitelist_json,
|
|
164
|
+
fuse_whitelist_for_chain,
|
|
165
|
+
fuse_whitelist_issues,
|
|
166
|
+
read_fuse_entries,
|
|
167
|
+
read_market_fuses,
|
|
168
|
+
)
|
|
149
169
|
from ipor_fusion.fuses import (
|
|
150
170
|
AaveV3BorrowFuse,
|
|
151
171
|
AaveV3SupplyFuse,
|
|
@@ -405,6 +425,7 @@ from ipor_fusion.validation import (
|
|
|
405
425
|
VaultState,
|
|
406
426
|
VaultValidation,
|
|
407
427
|
WithdrawQueue,
|
|
428
|
+
read_vault_fuse_whitelist,
|
|
408
429
|
validate_vault,
|
|
409
430
|
validate_vault_state,
|
|
410
431
|
)
|
|
@@ -537,6 +558,24 @@ __all__ = [
|
|
|
537
558
|
"fetch_address_registries",
|
|
538
559
|
"fetch_address_registry",
|
|
539
560
|
"registry_url",
|
|
561
|
+
"FUSE_WHITELIST_READ_ERRORS",
|
|
562
|
+
"FUSE_WHITELIST_REGISTRY_NAME",
|
|
563
|
+
"FuseIssueKind",
|
|
564
|
+
"FuseRole",
|
|
565
|
+
"FuseState",
|
|
566
|
+
"FuseWhitelist",
|
|
567
|
+
"FuseWhitelistCheck",
|
|
568
|
+
"FuseWhitelistIssue",
|
|
569
|
+
"FuseWhitelistJson",
|
|
570
|
+
"WhitelistEntry",
|
|
571
|
+
"WhitelistEntryJson",
|
|
572
|
+
"build_fuse_whitelist_json",
|
|
573
|
+
"check_fuses",
|
|
574
|
+
"fetch_fuse_whitelist_json",
|
|
575
|
+
"fuse_whitelist_for_chain",
|
|
576
|
+
"fuse_whitelist_issues",
|
|
577
|
+
"read_fuse_entries",
|
|
578
|
+
"read_market_fuses",
|
|
540
579
|
"ContextManager",
|
|
541
580
|
"Call",
|
|
542
581
|
"get_logs_adaptive",
|
|
@@ -791,6 +830,7 @@ __all__ = [
|
|
|
791
830
|
"WithdrawQueue",
|
|
792
831
|
"validate_vault",
|
|
793
832
|
"validate_vault_state",
|
|
833
|
+
"read_vault_fuse_whitelist",
|
|
794
834
|
"compute_update_groups",
|
|
795
835
|
"compute_update_reach",
|
|
796
836
|
"find_markets_missing_erc20_dependency",
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""`fusion fuse whitelist` — the fuses the chain's Fuse Whitelist lists for a market."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json as json_lib
|
|
6
|
+
from datetime import UTC, datetime
|
|
7
|
+
|
|
8
|
+
import click
|
|
9
|
+
|
|
10
|
+
from ipor_fusion.cli.config_store import load_config
|
|
11
|
+
from ipor_fusion.cli.options import BLOCK_NUMBER, CHAIN, _resolve_provider
|
|
12
|
+
from ipor_fusion.cli.vault_rendering import _print_table
|
|
13
|
+
from ipor_fusion.core.context import Web3Context
|
|
14
|
+
from ipor_fusion.errors import (
|
|
15
|
+
AddressNotInRegistryError,
|
|
16
|
+
AddressRegistryError,
|
|
17
|
+
EmptyCallResultError,
|
|
18
|
+
UnsupportedChainError,
|
|
19
|
+
)
|
|
20
|
+
from ipor_fusion.fuse_whitelist import MAX_MARKET_ID, fetch_fuse_whitelist_json
|
|
21
|
+
from ipor_fusion.types import ChainId, MarketId
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@click.group()
|
|
25
|
+
def fuse() -> None:
|
|
26
|
+
"""Inspect fuses: which ones IPOR whitelists for a market."""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@fuse.command("whitelist")
|
|
30
|
+
@click.option(
|
|
31
|
+
"--chain",
|
|
32
|
+
"chain_id",
|
|
33
|
+
type=CHAIN,
|
|
34
|
+
required=True,
|
|
35
|
+
help="Chain ID or name (ethereum, base, arbitrum, ...).",
|
|
36
|
+
)
|
|
37
|
+
@click.option(
|
|
38
|
+
"--market-id",
|
|
39
|
+
"market_id",
|
|
40
|
+
type=click.IntRange(min=0, max=MAX_MARKET_ID),
|
|
41
|
+
required=True,
|
|
42
|
+
help="Numeric market ID (IporFusionMarkets), e.g. 11 for EULER_V2.",
|
|
43
|
+
)
|
|
44
|
+
@click.option(
|
|
45
|
+
"--block-number",
|
|
46
|
+
"--block",
|
|
47
|
+
"block_number",
|
|
48
|
+
type=BLOCK_NUMBER,
|
|
49
|
+
default=None,
|
|
50
|
+
help="Block number for on-chain reads (0 or omitted: latest).",
|
|
51
|
+
)
|
|
52
|
+
@click.option(
|
|
53
|
+
"--include-deprecated",
|
|
54
|
+
is_flag=True,
|
|
55
|
+
default=False,
|
|
56
|
+
help="Also list deprecated and removed fuses.",
|
|
57
|
+
)
|
|
58
|
+
@click.option(
|
|
59
|
+
"--json",
|
|
60
|
+
"json_output",
|
|
61
|
+
is_flag=True,
|
|
62
|
+
default=False,
|
|
63
|
+
help="Emit machine-readable JSON instead of a table.",
|
|
64
|
+
)
|
|
65
|
+
def whitelist(
|
|
66
|
+
chain_id: ChainId,
|
|
67
|
+
market_id: int,
|
|
68
|
+
block_number: int | None,
|
|
69
|
+
include_deprecated: bool,
|
|
70
|
+
json_output: bool,
|
|
71
|
+
) -> None:
|
|
72
|
+
"""List the whitelisted fuses of a market: use one of these instead of
|
|
73
|
+
deploying a copy, which the IPOR app would show as unknown."""
|
|
74
|
+
ctx = Web3Context.from_url(_resolve_provider(load_config(), chain_id))
|
|
75
|
+
if block_number is not None:
|
|
76
|
+
ctx = ctx.at_block(block_number)
|
|
77
|
+
try:
|
|
78
|
+
document = fetch_fuse_whitelist_json(
|
|
79
|
+
ctx, MarketId(market_id), include_deprecated=include_deprecated
|
|
80
|
+
)
|
|
81
|
+
except (
|
|
82
|
+
AddressNotInRegistryError,
|
|
83
|
+
AddressRegistryError,
|
|
84
|
+
EmptyCallResultError,
|
|
85
|
+
UnsupportedChainError,
|
|
86
|
+
) as exc:
|
|
87
|
+
raise click.UsageError(str(exc)) from exc
|
|
88
|
+
if json_output:
|
|
89
|
+
click.echo(json_lib.dumps(document, indent=2))
|
|
90
|
+
return
|
|
91
|
+
click.secho(
|
|
92
|
+
f"Fuse Whitelist {document['whitelist']} on {document['chain']},"
|
|
93
|
+
f" market {document['market']}",
|
|
94
|
+
bold=True,
|
|
95
|
+
)
|
|
96
|
+
_print_table(
|
|
97
|
+
("Fuse", "State", "Type", "Role", "Added"),
|
|
98
|
+
[
|
|
99
|
+
(
|
|
100
|
+
f["fuse"],
|
|
101
|
+
f["state"],
|
|
102
|
+
f["type_name"],
|
|
103
|
+
f["role"] or "?",
|
|
104
|
+
datetime.fromtimestamp(f["added_at"], UTC).date().isoformat(),
|
|
105
|
+
)
|
|
106
|
+
for f in document["fuses"]
|
|
107
|
+
],
|
|
108
|
+
)
|
|
@@ -8,6 +8,7 @@ import click
|
|
|
8
8
|
from ipor_fusion.cli.address_cmd import address
|
|
9
9
|
from ipor_fusion.cli.changelog_cmd import changelog
|
|
10
10
|
from ipor_fusion.cli.config_cmd import config
|
|
11
|
+
from ipor_fusion.cli.fuse_cmd import fuse
|
|
11
12
|
from ipor_fusion.cli.market_cmd import market
|
|
12
13
|
from ipor_fusion.cli.preflight_cmd import preflight
|
|
13
14
|
from ipor_fusion.cli.vault_cmd import vault
|
|
@@ -34,6 +35,7 @@ def cli(ctx: click.Context, verbose: bool, quiet: bool, no_color: bool) -> None:
|
|
|
34
35
|
cli.add_command(address)
|
|
35
36
|
cli.add_command(changelog)
|
|
36
37
|
cli.add_command(config)
|
|
38
|
+
cli.add_command(fuse)
|
|
37
39
|
cli.add_command(market)
|
|
38
40
|
cli.add_command(vault)
|
|
39
41
|
vault.add_command(preflight)
|