ipor-fusion 4.0.0.dev279__tar.gz → 4.0.0.dev282__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.dev279 → ipor_fusion-4.0.0.dev282}/PKG-INFO +1 -1
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/universal.py +38 -7
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_fuse_encoding.py +72 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/AGENTS.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/MIGRATION_4.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/README.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/address_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/context_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/hypercore/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/registry.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_event_args.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_golden.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_live.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_address.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_mcp_parity.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_governance_wrappers.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_mcp_address.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_registry.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/uv.lock +0 -0
|
@@ -14,14 +14,18 @@ from ipor_fusion.types import Amount, FuseAddress
|
|
|
14
14
|
class UniversalTokenSwapperAbi(Enum):
|
|
15
15
|
"""ABI revision of the deployed UniversalTokenSwapperFuse contract.
|
|
16
16
|
|
|
17
|
-
Deployed fuses are immutable, so
|
|
18
|
-
older deployments (e.g. Base) accept only the LEGACY signature,
|
|
19
|
-
ones (
|
|
20
|
-
|
|
17
|
+
Deployed fuses are immutable, so the revisions coexist across chains:
|
|
18
|
+
older deployments (e.g. Base) accept only the LEGACY signature, the
|
|
19
|
+
HyperEVM ones (markets 12 and 1202) only the MIN_AMOUNT_OUT one, and the
|
|
20
|
+
Arbitrum fuses of the 2026-10-21 contracts release (markets 12 and 1202)
|
|
21
|
+
only TOKENS_TO_RETURN, which adds the tokens the swap calls may leave in
|
|
22
|
+
the executor. Pick the member matching the fuse address this instance is
|
|
23
|
+
bound to.
|
|
21
24
|
"""
|
|
22
25
|
|
|
23
26
|
LEGACY = auto()
|
|
24
27
|
MIN_AMOUNT_OUT = auto()
|
|
28
|
+
TOKENS_TO_RETURN = auto()
|
|
25
29
|
|
|
26
30
|
|
|
27
31
|
class UniversalTokenSwapperSubstrates:
|
|
@@ -73,7 +77,11 @@ class UniversalTokenSwapperFuse(Fuse):
|
|
|
73
77
|
targets: list[ChecksumAddress],
|
|
74
78
|
data: list[bytes],
|
|
75
79
|
min_amount_out: Amount | None = None,
|
|
80
|
+
tokens_to_return: list[ChecksumAddress] | None = None,
|
|
76
81
|
) -> FuseAction:
|
|
82
|
+
"""``tokens_to_return`` (TOKENS_TO_RETURN only): intermediate or extra
|
|
83
|
+
output tokens the swap calls may leave in the executor, each a granted
|
|
84
|
+
Token substrate; the executor returns them to the vault."""
|
|
77
85
|
self._validate_address(token_in, "token_in")
|
|
78
86
|
self._validate_address(token_out, "token_out")
|
|
79
87
|
self._validate_amount(amount_in, "amount_in")
|
|
@@ -81,6 +89,13 @@ class UniversalTokenSwapperFuse(Fuse):
|
|
|
81
89
|
raise ValueError(
|
|
82
90
|
f"targets and data must have the same length, got {len(targets)} and {len(data)}"
|
|
83
91
|
)
|
|
92
|
+
if (
|
|
93
|
+
tokens_to_return is not None
|
|
94
|
+
and self._abi is not UniversalTokenSwapperAbi.TOKENS_TO_RETURN
|
|
95
|
+
):
|
|
96
|
+
raise ValueError(
|
|
97
|
+
"tokens_to_return requires abi=UniversalTokenSwapperAbi.TOKENS_TO_RETURN"
|
|
98
|
+
)
|
|
84
99
|
if self._abi is UniversalTokenSwapperAbi.LEGACY:
|
|
85
100
|
if min_amount_out is not None:
|
|
86
101
|
raise ValueError(
|
|
@@ -92,11 +107,27 @@ class UniversalTokenSwapperFuse(Fuse):
|
|
|
92
107
|
)
|
|
93
108
|
if min_amount_out is None:
|
|
94
109
|
raise ValueError(
|
|
95
|
-
"min_amount_out is required with abi=UniversalTokenSwapperAbi.
|
|
110
|
+
f"min_amount_out is required with abi=UniversalTokenSwapperAbi.{self._abi.name}"
|
|
96
111
|
" (pass 0 to rely on the vault-side slippage cap only)"
|
|
97
112
|
)
|
|
98
113
|
self._validate_non_negative(min_amount_out, "min_amount_out")
|
|
114
|
+
if self._abi is UniversalTokenSwapperAbi.MIN_AMOUNT_OUT:
|
|
115
|
+
return self._action_raw(
|
|
116
|
+
"enter((address,address,uint256,uint256,(address[],bytes[])))",
|
|
117
|
+
[[token_in, token_out, amount_in, min_amount_out, [targets, data]]],
|
|
118
|
+
)
|
|
119
|
+
returned = list(tokens_to_return or [])
|
|
120
|
+
for index, token in enumerate(returned):
|
|
121
|
+
self._validate_address(token, f"tokens_to_return[{index}]")
|
|
99
122
|
return self._action_raw(
|
|
100
|
-
"enter((address,address,uint256,uint256,(address[],bytes[])))",
|
|
101
|
-
[
|
|
123
|
+
"enter((address,address,uint256,uint256,(address[],bytes[],address[])))",
|
|
124
|
+
[
|
|
125
|
+
[
|
|
126
|
+
token_in,
|
|
127
|
+
token_out,
|
|
128
|
+
amount_in,
|
|
129
|
+
min_amount_out,
|
|
130
|
+
[targets, data, returned],
|
|
131
|
+
]
|
|
132
|
+
],
|
|
102
133
|
)
|
|
@@ -816,6 +816,78 @@ class TestUniversalTokenSwapperFuse:
|
|
|
816
816
|
assert decoded_tuple[3] == 4900
|
|
817
817
|
assert decoded_tuple[4][1][0] == b"\xaa\xbb"
|
|
818
818
|
|
|
819
|
+
def test_swap_tokens_to_return_abi(self):
|
|
820
|
+
"""The Arbitrum fuses of the 2026-10-21 release (markets 12 and 1202,
|
|
821
|
+
0xD42940B4… and 0x9d74A79b…) carry only this selector."""
|
|
822
|
+
action = UniversalTokenSwapperFuse(
|
|
823
|
+
FUSE_ADDR, abi=UniversalTokenSwapperAbi.TOKENS_TO_RETURN
|
|
824
|
+
).swap(
|
|
825
|
+
token_in=TOKEN_A,
|
|
826
|
+
token_out=TOKEN_B,
|
|
827
|
+
amount_in=5000,
|
|
828
|
+
targets=[TOKEN_A],
|
|
829
|
+
data=[b"\xaa\xbb"],
|
|
830
|
+
min_amount_out=4900,
|
|
831
|
+
tokens_to_return=[TOKEN_B],
|
|
832
|
+
)
|
|
833
|
+
signature = (
|
|
834
|
+
"enter((address,address,uint256,uint256,(address[],bytes[],address[])))"
|
|
835
|
+
)
|
|
836
|
+
assert action.data[:4] == _selector(signature)
|
|
837
|
+
assert _selector(signature).hex() == "3b2607a8"
|
|
838
|
+
(decoded_tuple,) = decode(
|
|
839
|
+
["(address,address,uint256,uint256,(address[],bytes[],address[]))"],
|
|
840
|
+
action.data[4:],
|
|
841
|
+
)
|
|
842
|
+
assert decoded_tuple[3] == 4900
|
|
843
|
+
assert decoded_tuple[4][1][0] == b"\xaa\xbb"
|
|
844
|
+
assert [t.lower() for t in decoded_tuple[4][2]] == [TOKEN_B_LOW]
|
|
845
|
+
empty = UniversalTokenSwapperFuse(
|
|
846
|
+
FUSE_ADDR, abi=UniversalTokenSwapperAbi.TOKENS_TO_RETURN
|
|
847
|
+
).swap(
|
|
848
|
+
token_in=TOKEN_A,
|
|
849
|
+
token_out=TOKEN_B,
|
|
850
|
+
amount_in=1,
|
|
851
|
+
targets=[],
|
|
852
|
+
data=[],
|
|
853
|
+
min_amount_out=0,
|
|
854
|
+
)
|
|
855
|
+
assert (
|
|
856
|
+
decode(
|
|
857
|
+
["(address,address,uint256,uint256,(address[],bytes[],address[]))"],
|
|
858
|
+
empty.data[4:],
|
|
859
|
+
)[0][4][2]
|
|
860
|
+
== ()
|
|
861
|
+
)
|
|
862
|
+
|
|
863
|
+
def test_tokens_to_return_abi_requires_min_amount_out(self):
|
|
864
|
+
with pytest.raises(
|
|
865
|
+
ValueError, match="abi=UniversalTokenSwapperAbi.TOKENS_TO_RETURN"
|
|
866
|
+
):
|
|
867
|
+
UniversalTokenSwapperFuse(
|
|
868
|
+
FUSE_ADDR, abi=UniversalTokenSwapperAbi.TOKENS_TO_RETURN
|
|
869
|
+
).swap(
|
|
870
|
+
token_in=TOKEN_A,
|
|
871
|
+
token_out=TOKEN_B,
|
|
872
|
+
amount_in=1,
|
|
873
|
+
targets=[],
|
|
874
|
+
data=[],
|
|
875
|
+
)
|
|
876
|
+
|
|
877
|
+
def test_tokens_to_return_needs_its_abi(self):
|
|
878
|
+
with pytest.raises(ValueError, match="TOKENS_TO_RETURN"):
|
|
879
|
+
UniversalTokenSwapperFuse(
|
|
880
|
+
FUSE_ADDR, abi=UniversalTokenSwapperAbi.MIN_AMOUNT_OUT
|
|
881
|
+
).swap(
|
|
882
|
+
token_in=TOKEN_A,
|
|
883
|
+
token_out=TOKEN_B,
|
|
884
|
+
amount_in=1,
|
|
885
|
+
targets=[],
|
|
886
|
+
data=[],
|
|
887
|
+
min_amount_out=0,
|
|
888
|
+
tokens_to_return=[TOKEN_B],
|
|
889
|
+
)
|
|
890
|
+
|
|
819
891
|
def test_swap_min_amount_out_zero_allowed(self):
|
|
820
892
|
action = UniversalTokenSwapperFuse(
|
|
821
893
|
FUSE_ADDR, abi=UniversalTokenSwapperAbi.MIN_AMOUNT_OUT
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.dev279 → ipor_fusion-4.0.0.dev282}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/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
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_info_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/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
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/context_manager.py
RENAMED
|
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.dev279 → ipor_fusion-4.0.0.dev282}/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.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/rewards_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/simulation_result.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/lane.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/messages.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/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.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/fuses/external_state.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/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.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/compound_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/position_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev279 → ipor_fusion-4.0.0.dev282}/src/ipor_fusion/readers/unpriceable.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|