ipor-fusion 4.0.0.dev206__tar.gz → 4.0.0.dev210__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.dev206 → ipor_fusion-4.0.0.dev210}/MIGRATION_4.md +7 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/PKG-INFO +1 -1
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/lane.py +32 -3
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_lane.py +58 -3
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/AGENTS.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/README.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_event_args.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_golden.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_live.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/uv.lock +0 -0
|
@@ -950,6 +950,13 @@ and `log_index` was passed through as given (a hex string from a raw log); the e
|
|
|
950
950
|
These apply to every caller, type-checked or not. Changes described in full above
|
|
951
951
|
are listed with a link.
|
|
952
952
|
|
|
953
|
+
- **`CcipLane.open` refuses a spoke it cannot reach.** The executor's
|
|
954
|
+
`ccipRoute(spoke)` must be registered and point at the dispatcher at the
|
|
955
|
+
executor's own address; otherwise `open` (and `open_lane` / `open_lanes`)
|
|
956
|
+
raises `CrosschainDiscoveryError`, where 3.x built a lane whose default send
|
|
957
|
+
parameters carried a zero fee cap and gas limit and failed only on chain. A
|
|
958
|
+
registered but disabled route still opens, but `default_send` raises.
|
|
959
|
+
|
|
953
960
|
- **The reconciliation counts the rewards claim manager.** `PlasmaVault.totalAssets`
|
|
954
961
|
adds `RewardsClaimManager.balanceOf()` (vested rewards) to the vault's idle
|
|
955
962
|
underlying and its markets; 3.x left it out, so a vault with vested rewards showed
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/lane.py
RENAMED
|
@@ -22,7 +22,8 @@ from ipor_fusion.crosschain.fuses.ccip import (
|
|
|
22
22
|
)
|
|
23
23
|
from ipor_fusion.crosschain.lane import CrosschainLane, LaneFuses, LaneObservation
|
|
24
24
|
from ipor_fusion.crosschain.messages import CommandStatus, CrosschainTransportKind
|
|
25
|
-
from ipor_fusion.
|
|
25
|
+
from ipor_fusion.errors import CrosschainDiscoveryError
|
|
26
|
+
from ipor_fusion.types import Amount, ChainId, Period, ProposalId
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
class CcipLane(CrosschainLane):
|
|
@@ -30,7 +31,12 @@ class CcipLane(CrosschainLane):
|
|
|
30
31
|
send parameters come from the executor's registered ``route`` (fee
|
|
31
32
|
ceiling, fee token, token or message gas limit). ``decimal_conversion_rate``
|
|
32
33
|
is the executor's ``DECIMAL_CONVERSION_RATE`` (local per shared unit), used
|
|
33
|
-
to report the dispatcher observation in local decimals.
|
|
34
|
+
to report the dispatcher observation in local decimals.
|
|
35
|
+
|
|
36
|
+
`open` refuses a spoke the executor has no route to, or whose route names
|
|
37
|
+
another peer than the dispatcher at the executor's address; a registered but
|
|
38
|
+
disabled route opens (state can still be read) and refuses the default send
|
|
39
|
+
parameters."""
|
|
34
40
|
|
|
35
41
|
transport_kind = CrosschainTransportKind.CHAINLINK_CCIP
|
|
36
42
|
enforces_min_received = False
|
|
@@ -77,13 +83,15 @@ class CcipLane(CrosschainLane):
|
|
|
77
83
|
fuses: LaneFuses,
|
|
78
84
|
) -> CcipLane:
|
|
79
85
|
hub_executor = CcipCrosschainExecutor(executor)
|
|
86
|
+
route = hub_executor.ccip_route(spoke_ctx.chain_id).call(hub_ctx)
|
|
87
|
+
_require_route_to_dispatcher(route, hub_executor.address, spoke_ctx.chain_id)
|
|
80
88
|
return cls(
|
|
81
89
|
hub_ctx=hub_ctx,
|
|
82
90
|
spoke_ctx=spoke_ctx,
|
|
83
91
|
executor=hub_executor,
|
|
84
92
|
dispatcher=CcipCrosschainDispatcher(executor),
|
|
85
93
|
fuses=fuses,
|
|
86
|
-
route=
|
|
94
|
+
route=route,
|
|
87
95
|
decimal_conversion_rate=hub_executor.decimal_conversion_rate().call(
|
|
88
96
|
hub_ctx
|
|
89
97
|
),
|
|
@@ -93,6 +101,11 @@ class CcipLane(CrosschainLane):
|
|
|
93
101
|
return self.executor.balance_staleness_max()
|
|
94
102
|
|
|
95
103
|
def default_send(self, *, token: bool) -> CcipSendParams:
|
|
104
|
+
if not self.route.enabled:
|
|
105
|
+
raise CrosschainDiscoveryError(
|
|
106
|
+
f"CCIP route of executor {self.executor.address} to chain "
|
|
107
|
+
f"{self.spoke_chain_id} is disabled"
|
|
108
|
+
)
|
|
96
109
|
return CcipSendParams.from_route(self.route, token=token)
|
|
97
110
|
|
|
98
111
|
def default_command_send(self) -> CcipSendParams:
|
|
@@ -156,3 +169,19 @@ def _to_lane(observation: CcipObservation, rate: int) -> LaneObservation:
|
|
|
156
169
|
command_config_epoch=observation.command_config_epoch,
|
|
157
170
|
tracked_position_set_hash=observation.tracked_position_set_hash,
|
|
158
171
|
)
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _require_route_to_dispatcher(
|
|
175
|
+
route: CcipRouteConfig, executor: ChecksumAddress, spoke: ChainId
|
|
176
|
+
) -> None:
|
|
177
|
+
"""The executor sends to the dispatcher at its own address on the spoke; an
|
|
178
|
+
unregistered route reads back as all zeros."""
|
|
179
|
+
if route.chain_selector == 0 or int(route.peer, 16) == 0:
|
|
180
|
+
raise CrosschainDiscoveryError(
|
|
181
|
+
f"CCIP executor {executor} has no route to chain {spoke}"
|
|
182
|
+
)
|
|
183
|
+
if route.peer != executor:
|
|
184
|
+
raise CrosschainDiscoveryError(
|
|
185
|
+
f"CCIP executor {executor} routes chain {spoke} to {route.peer}, "
|
|
186
|
+
"not to the dispatcher at its own address"
|
|
187
|
+
)
|
|
@@ -3,7 +3,7 @@ the per-transport fuses encode, normalizes reads, and finds its own parts."""
|
|
|
3
3
|
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from dataclasses import astuple
|
|
6
|
+
from dataclasses import astuple, replace
|
|
7
7
|
from unittest.mock import MagicMock
|
|
8
8
|
|
|
9
9
|
import pytest
|
|
@@ -662,7 +662,8 @@ def _deployment_ctx() -> MagicMock:
|
|
|
662
662
|
probe_vault = PlasmaVault(VAULT)
|
|
663
663
|
probe_exec = StargateCrosschainExecutor(EXECUTOR)
|
|
664
664
|
route_raw = encode(
|
|
665
|
-
["(uint64,address,address,uint96,uint96,uint256,bool)"],
|
|
665
|
+
["(uint64,address,address,uint96,uint96,uint256,bool)"],
|
|
666
|
+
[replace(ROUTE, peer=CCIP_EXECUTOR).as_tuple()],
|
|
666
667
|
)
|
|
667
668
|
by_selector: dict[tuple[str, bytes], bytes] = {
|
|
668
669
|
(VAULT, _sel(probe_vault.get_market_substrates(MARKET))): encode(
|
|
@@ -845,7 +846,10 @@ class TestDeploymentDiscovery:
|
|
|
845
846
|
CCIP_EXECUTOR,
|
|
846
847
|
]
|
|
847
848
|
ccip = next(lane for lane in lanes if isinstance(lane, CcipLane))
|
|
848
|
-
assert
|
|
849
|
+
assert (
|
|
850
|
+
ccip.route == replace(ROUTE, peer=CCIP_EXECUTOR)
|
|
851
|
+
and ccip.fuses == CCIP_FUSES
|
|
852
|
+
)
|
|
849
853
|
assert ccip.decimal_conversion_rate == DECIMAL_CONVERSION_RATE
|
|
850
854
|
|
|
851
855
|
|
|
@@ -1036,6 +1040,57 @@ class TestContextOwnership:
|
|
|
1036
1040
|
assert observation.accounted_balance == 7
|
|
1037
1041
|
hub.call.assert_not_called()
|
|
1038
1042
|
|
|
1043
|
+
def _ccip_hub(self, route: CcipRouteConfig) -> MagicMock:
|
|
1044
|
+
return _ctx_answering(
|
|
1045
|
+
{
|
|
1046
|
+
selector("ccipRoute(uint256)"): encode(
|
|
1047
|
+
["(uint64,address,address,uint96,uint96,uint256,bool)"],
|
|
1048
|
+
[route.as_tuple()],
|
|
1049
|
+
),
|
|
1050
|
+
selector("DECIMAL_CONVERSION_RATE()"): encode(
|
|
1051
|
+
["uint256"], [DECIMAL_CONVERSION_RATE]
|
|
1052
|
+
),
|
|
1053
|
+
}
|
|
1054
|
+
)
|
|
1055
|
+
|
|
1056
|
+
def test_ccip_open_refuses_a_spoke_without_a_route(self):
|
|
1057
|
+
unregistered = CcipRouteConfig(
|
|
1058
|
+
chain_selector=0,
|
|
1059
|
+
peer=ZERO_ADDRESS, # type: ignore[arg-type]
|
|
1060
|
+
fee_token=ZERO_ADDRESS, # type: ignore[arg-type]
|
|
1061
|
+
message_gas_limit=0,
|
|
1062
|
+
token_gas_limit=0,
|
|
1063
|
+
max_fee=0,
|
|
1064
|
+
enabled=False,
|
|
1065
|
+
)
|
|
1066
|
+
with pytest.raises(CrosschainDiscoveryError, match="has no route to chain"):
|
|
1067
|
+
CcipLane.open(
|
|
1068
|
+
self._ccip_hub(unregistered),
|
|
1069
|
+
self._wrong_chain(SPOKE),
|
|
1070
|
+
executor=EXECUTOR,
|
|
1071
|
+
fuses=FUSES,
|
|
1072
|
+
)
|
|
1073
|
+
|
|
1074
|
+
def test_ccip_open_refuses_a_route_to_another_peer(self):
|
|
1075
|
+
foreign = replace(ROUTE, peer=REMOTE_VAULT)
|
|
1076
|
+
with pytest.raises(CrosschainDiscoveryError, match="not to the dispatcher"):
|
|
1077
|
+
CcipLane.open(
|
|
1078
|
+
self._ccip_hub(foreign),
|
|
1079
|
+
self._wrong_chain(SPOKE),
|
|
1080
|
+
executor=EXECUTOR,
|
|
1081
|
+
fuses=FUSES,
|
|
1082
|
+
)
|
|
1083
|
+
|
|
1084
|
+
def test_a_disabled_route_opens_but_refuses_default_send(self):
|
|
1085
|
+
lane = CcipLane.open(
|
|
1086
|
+
self._ccip_hub(replace(ROUTE, enabled=False)),
|
|
1087
|
+
self._wrong_chain(SPOKE),
|
|
1088
|
+
executor=EXECUTOR,
|
|
1089
|
+
fuses=FUSES,
|
|
1090
|
+
)
|
|
1091
|
+
with pytest.raises(CrosschainDiscoveryError, match="is disabled"):
|
|
1092
|
+
lane.default_send(token=True)
|
|
1093
|
+
|
|
1039
1094
|
def test_ccip_open_reads_the_route_on_the_hub(self):
|
|
1040
1095
|
route_raw = encode(
|
|
1041
1096
|
["(uint64,address,address,uint96,uint96,uint256,bool)"], [ROUTE.as_tuple()]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.dev206 → ipor_fusion-4.0.0.dev210}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/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
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_info_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/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
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/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.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/rewards_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/simulation_result.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/messages.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/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.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/fuses/external_state.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/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.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/compound_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/position_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev206 → ipor_fusion-4.0.0.dev210}/src/ipor_fusion/readers/unpriceable.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|