ipor-fusion 4.0.0.dev185__tar.gz → 4.0.0.dev191__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.0.0.dev185 → ipor_fusion-4.0.0.dev191}/PKG-INFO +3 -1
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/README.md +2 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/chains.py +4 -2
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/fuse.py +25 -2
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_chains.py +6 -4
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_fuse_encoding.py +64 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/AGENTS.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/MIGRATION_4.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_event_args.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_golden.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ipor-fusion
|
|
3
|
-
Version: 4.0.0.
|
|
3
|
+
Version: 4.0.0.dev191
|
|
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
|
|
@@ -507,6 +507,8 @@ validated on every live vault of these chains (`SUPPORTED_CHAIN_IDS`):
|
|
|
507
507
|
- **Avalanche** C-Chain
|
|
508
508
|
- **Katana**
|
|
509
509
|
- **Monad**
|
|
510
|
+
- **Ink** and **Robinhood**, which have no live vault yet: validated on a vault freshly
|
|
511
|
+
cloned through their FusionFactory on a fork
|
|
510
512
|
|
|
511
513
|
Balance fuses and the withdraw manager are read from vault storage. The remaining event
|
|
512
514
|
scans (role holders, pending withdraw requests) page `eth_getLogs` within the provider's
|
|
@@ -459,6 +459,8 @@ validated on every live vault of these chains (`SUPPORTED_CHAIN_IDS`):
|
|
|
459
459
|
- **Avalanche** C-Chain
|
|
460
460
|
- **Katana**
|
|
461
461
|
- **Monad**
|
|
462
|
+
- **Ink** and **Robinhood**, which have no live vault yet: validated on a vault freshly
|
|
463
|
+
cloned through their FusionFactory on a fork
|
|
462
464
|
|
|
463
465
|
Balance fuses and the withdraw manager are read from vault storage. The remaining event
|
|
464
466
|
scans (role holders, pending withdraw requests) page `eth_getLogs` within the provider's
|
|
@@ -32,9 +32,11 @@ CHAIN_NAME_TO_ID: dict[str, ChainId] = {name: cid for cid, name in CHAIN_NAMES.i
|
|
|
32
32
|
# validated on. A provider for another chain may connect fine and still fail
|
|
33
33
|
# deeper in the stack (a missing Multicall3, an oracle quirk, an eth_getLogs
|
|
34
34
|
# cap the adaptive scan cannot page through). Extend only after the full
|
|
35
|
-
# vault_info path passes on every live vault of that chain
|
|
35
|
+
# vault_info path passes on every live vault of that chain — or, for a chain
|
|
36
|
+
# with none yet (Ink, Robinhood), on a vault cloned through its FusionFactory.
|
|
36
37
|
SUPPORTED_CHAIN_IDS: frozenset[ChainId] = frozenset(
|
|
37
|
-
ChainId(cid)
|
|
38
|
+
ChainId(cid)
|
|
39
|
+
for cid in (1, 130, 143, 999, 4663, 8453, 9745, 42161, 43114, 57073, 747474)
|
|
38
40
|
)
|
|
39
41
|
|
|
40
42
|
# First eth_getLogs page size, in blocks, on chains whose providers cap the
|
|
@@ -8,6 +8,7 @@ without importing that package, whose ``__init__`` loads every encoder.
|
|
|
8
8
|
|
|
9
9
|
from abc import ABC
|
|
10
10
|
from collections.abc import Sequence
|
|
11
|
+
from types import MemberDescriptorType
|
|
11
12
|
|
|
12
13
|
from eth_abi import encode
|
|
13
14
|
from eth_typing import ChecksumAddress
|
|
@@ -55,11 +56,33 @@ class Fuse(ABC): # noqa: B024 # ABC marks intent; no shared abstract method
|
|
|
55
56
|
if value < 0:
|
|
56
57
|
raise ValueError(f"{name} must not be negative, got {value}")
|
|
57
58
|
|
|
59
|
+
def _value_state(self) -> tuple[tuple[str, object], ...]:
|
|
60
|
+
"""Every attribute the instance stores, in its ``__dict__`` or in a
|
|
61
|
+
subclass's ``__slots__``, sorted by name."""
|
|
62
|
+
state = dict(vars(self))
|
|
63
|
+
# Slot storage is a member descriptor in the declaring class's own
|
|
64
|
+
# namespace (already name-mangled). Reading each one directly, keyed by
|
|
65
|
+
# its class, keeps a base slot shadowed by a subclass attribute apart.
|
|
66
|
+
for klass in type(self).__mro__:
|
|
67
|
+
for name, member in vars(klass).items():
|
|
68
|
+
if not isinstance(member, MemberDescriptorType):
|
|
69
|
+
continue
|
|
70
|
+
try:
|
|
71
|
+
value = member.__get__(self, klass)
|
|
72
|
+
except AttributeError:
|
|
73
|
+
continue
|
|
74
|
+
state[f"{klass.__module__}.{klass.__qualname__}.{name}"] = value
|
|
75
|
+
return tuple(sorted(state.items()))
|
|
76
|
+
|
|
58
77
|
def __eq__(self, other: object) -> bool:
|
|
59
|
-
return
|
|
78
|
+
return (
|
|
79
|
+
isinstance(other, Fuse)
|
|
80
|
+
and type(self) is type(other)
|
|
81
|
+
and self._value_state() == other._value_state()
|
|
82
|
+
)
|
|
60
83
|
|
|
61
84
|
def __hash__(self) -> int:
|
|
62
|
-
return hash((type(self), *
|
|
85
|
+
return hash((type(self), *self._value_state()))
|
|
63
86
|
|
|
64
87
|
def _action_raw(self, signature: str, values: Sequence[object]) -> FuseAction:
|
|
65
88
|
selector = function_signature_to_4byte_selector(signature)
|
|
@@ -30,10 +30,10 @@ def test_message_lists_supported_chains():
|
|
|
30
30
|
with pytest.raises(
|
|
31
31
|
UnsupportedChainError,
|
|
32
32
|
match=r"ethereum \(1\), unichain \(130\), monad \(143\), hyperevm \(999\), "
|
|
33
|
-
r"
|
|
34
|
-
r"katana \(747474\)$",
|
|
33
|
+
r"robinhood \(4663\), base \(8453\), plasma \(9745\), arbitrum \(42161\), "
|
|
34
|
+
r"avalanche \(43114\), ink \(57073\), katana \(747474\)$",
|
|
35
35
|
):
|
|
36
|
-
ensure_supported_chain(
|
|
36
|
+
ensure_supported_chain(3637)
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
def test_error_hierarchy():
|
|
@@ -58,10 +58,12 @@ def test_supported_chains():
|
|
|
58
58
|
"arbitrum",
|
|
59
59
|
"avalanche",
|
|
60
60
|
"katana",
|
|
61
|
+
"ink",
|
|
62
|
+
"robinhood",
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
|
|
64
|
-
@pytest.mark.parametrize("chain_id", [239,
|
|
66
|
+
@pytest.mark.parametrize("chain_id", [239, 3637, 14])
|
|
65
67
|
def test_chains_without_validated_vaults_stay_gated(chain_id):
|
|
66
68
|
with pytest.raises(UnsupportedChainError):
|
|
67
69
|
ensure_supported_chain(chain_id)
|
|
@@ -10,6 +10,7 @@ from ipor_fusion.core.contract import _parse_param_types
|
|
|
10
10
|
from ipor_fusion.core.fuse_action import FuseAction
|
|
11
11
|
from ipor_fusion.fuses.aave_v3 import AaveV3BorrowFuse, AaveV3SupplyFuse
|
|
12
12
|
from ipor_fusion.fuses.async_action import AsyncActionFuse, AsyncActionSubstrates
|
|
13
|
+
from ipor_fusion.fuses.base import Fuse
|
|
13
14
|
from ipor_fusion.fuses.compound_v3 import CompoundV3SupplyFuse
|
|
14
15
|
from ipor_fusion.fuses.erc4626 import ERC4626SupplyFuse
|
|
15
16
|
from ipor_fusion.fuses.euler_v2 import (
|
|
@@ -893,6 +894,69 @@ class TestFuseEquality:
|
|
|
893
894
|
assert AaveV3SupplyFuse(FUSE_ADDR) != AaveV3BorrowFuse(FUSE_ADDR)
|
|
894
895
|
assert AaveV3SupplyFuse(FUSE_ADDR) != FUSE_ADDR
|
|
895
896
|
|
|
897
|
+
def test_state_kept_in_slots_counts(self):
|
|
898
|
+
class SlottedFuse(Fuse):
|
|
899
|
+
__slots__ = ("target", "__secret")
|
|
900
|
+
|
|
901
|
+
def __init__(self, address, target, secret):
|
|
902
|
+
super().__init__(address)
|
|
903
|
+
self.target = target
|
|
904
|
+
self.__secret = secret
|
|
905
|
+
|
|
906
|
+
one = SlottedFuse(FUSE_ADDR, TOKEN_A, 1)
|
|
907
|
+
assert one == SlottedFuse(FUSE_ADDR, TOKEN_A, 1)
|
|
908
|
+
assert hash(one) == hash(SlottedFuse(FUSE_ADDR, TOKEN_A, 1))
|
|
909
|
+
assert one != SlottedFuse(FUSE_ADDR, TOKEN_B, 1)
|
|
910
|
+
assert one != SlottedFuse(FUSE_ADDR, TOKEN_A, 2)
|
|
911
|
+
assert len({one, SlottedFuse(FUSE_ADDR, TOKEN_B, 1)}) == 2
|
|
912
|
+
|
|
913
|
+
def test_a_shadowed_base_slot_still_counts(self):
|
|
914
|
+
class Parent(Fuse):
|
|
915
|
+
__slots__ = ("target",)
|
|
916
|
+
|
|
917
|
+
class Child(Parent):
|
|
918
|
+
__slots__ = ("target",)
|
|
919
|
+
|
|
920
|
+
def child(base_target):
|
|
921
|
+
fuse = Child(FUSE_ADDR)
|
|
922
|
+
Parent.__dict__["target"].__set__(fuse, base_target)
|
|
923
|
+
fuse.target = 3
|
|
924
|
+
return fuse
|
|
925
|
+
|
|
926
|
+
assert child(1) != child(2)
|
|
927
|
+
assert len({child(1), child(2)}) == 2
|
|
928
|
+
assert child(1) == child(1)
|
|
929
|
+
|
|
930
|
+
def test_a_private_slot_of_an_all_underscore_class_counts(self):
|
|
931
|
+
class ___(Fuse): # noqa: N801
|
|
932
|
+
__slots__ = ("__secret",)
|
|
933
|
+
|
|
934
|
+
def __init__(self, address, secret):
|
|
935
|
+
super().__init__(address)
|
|
936
|
+
self.__secret = secret
|
|
937
|
+
|
|
938
|
+
assert ___(FUSE_ADDR, 1) != ___(FUSE_ADDR, 2)
|
|
939
|
+
assert ___(FUSE_ADDR, 1) == ___(FUSE_ADDR, 1)
|
|
940
|
+
|
|
941
|
+
def test_slots_declared_by_an_iterator_count(self):
|
|
942
|
+
class IteratorFuse(Fuse):
|
|
943
|
+
__slots__ = iter(("target",))
|
|
944
|
+
|
|
945
|
+
def fuse(target):
|
|
946
|
+
instance = IteratorFuse(FUSE_ADDR)
|
|
947
|
+
instance.target = target # pyright: ignore[reportAttributeAccessIssue]
|
|
948
|
+
return instance
|
|
949
|
+
|
|
950
|
+
assert fuse(1) != fuse(2)
|
|
951
|
+
assert len({fuse(1), fuse(2)}) == 2
|
|
952
|
+
|
|
953
|
+
def test_an_unset_slot_is_left_out(self):
|
|
954
|
+
class LazyFuse(Fuse):
|
|
955
|
+
__slots__ = "cached"
|
|
956
|
+
|
|
957
|
+
assert LazyFuse(FUSE_ADDR) == LazyFuse(FUSE_ADDR)
|
|
958
|
+
assert hash(LazyFuse(FUSE_ADDR)) == hash(LazyFuse(FUSE_ADDR))
|
|
959
|
+
|
|
896
960
|
|
|
897
961
|
# ── Input Validation ──────────────────────────────────────────────────
|
|
898
962
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/examples/simple_aave_v3_supply_base.py
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
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_info_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/cli/vault_rendering.py
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
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/fusion_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/rewards_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/simulation_result.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/lane.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/messages.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/crosschain/transport.py
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
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/external_state.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/fuses/fluid_instadapp.py
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
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/compound_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/position_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev185 → ipor_fusion-4.0.0.dev191}/src/ipor_fusion/readers/unpriceable.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|