ipor-fusion 4.0.0.dev210__tar.gz → 4.0.0.dev215__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.dev210 → ipor_fusion-4.0.0.dev215}/AGENTS.md +8 -4
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/MIGRATION_4.md +50 -10
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/PKG-INFO +26 -15
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/README.md +25 -14
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +22 -20
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +10 -8
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/scripts/crosschain_readiness.py +7 -2
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/__init__.py +1 -445
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/__init__.py +26 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/__init__.py +0 -126
- ipor_fusion-4.0.0.dev215/src/ipor_fusion/hypercore/__init__.py +214 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/__init__.py +0 -60
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/hypercore.py +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain.py +3 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain_lifecycle.py +7 -5
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain_recovery.py +3 -7
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_events.py +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_indexer.py +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_quote.py +2 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_chainlink.py +7 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_lane.py +13 -17
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_readiness.py +2 -2
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_transport.py +18 -16
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_deployment.py +2 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_events.py +2 -2
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_flow.py +3 -6
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_live.py +13 -14
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_outcome.py +2 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_readers.py +2 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_simulation.py +3 -6
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_models.py +1 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_public_api.py +228 -344
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_public_type_reachability.py +1 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_canary.py +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_hypercore.py +9 -5
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_hyperevm.py +10 -8
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_crosschain.py +1 -1
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/typed_client/consumer.py +25 -21
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/typed_client/rejected.py +2 -3
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_event_args.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_golden.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_live.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/uv.lock +0 -0
|
@@ -186,10 +186,14 @@ the lifecycle matrix follows that.
|
|
|
186
186
|
strings (`field_docs.py` ships as API documentation). Comments only for edge
|
|
187
187
|
cases and non-obvious logic.
|
|
188
188
|
- The public API is `ipor_fusion.__all__` (README, "Public API and stability").
|
|
189
|
-
Every public symbol is imported and listed there; a symbol of a
|
|
190
|
-
subpackage (`core`, `config`, `fuses`, `readers
|
|
191
|
-
|
|
192
|
-
|
|
189
|
+
Every stable public symbol is imported and listed there; a symbol of a stable
|
|
190
|
+
subpackage (`core`, `config`, `fuses`, `readers`) also goes in that
|
|
191
|
+
subpackage's `__all__`. Preview features (`PREVIEW_FEATURES`) export only from
|
|
192
|
+
their own subpackages, never from the top level: crosschain from `crosschain`
|
|
193
|
+
(`crosschain.fuses`, `crosschain.ccip`, `crosschain.stargate`), HyperCore from
|
|
194
|
+
`hypercore` (which re-exports from `fuses/` and `readers/` modules; those
|
|
195
|
+
subpackages do not list them). Their exceptions stay in `errors` and the top
|
|
196
|
+
level. `ipor_fusion.guide` keeps its own namespace. The
|
|
193
197
|
public modules (`about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`,
|
|
194
198
|
`field_docs`, `market_ids`, `market_info`, `morpho_api`, `substrates`, `types`,
|
|
195
199
|
`validation`, `vault_data`, `vault_info`) stay importable for the names they
|
|
@@ -23,12 +23,16 @@ the details, and each change is described once, in its section.
|
|
|
23
23
|
Work through these in order; each is what breaks first at run time after the one
|
|
24
24
|
before it is fixed.
|
|
25
25
|
|
|
26
|
-
1. **Removed and renamed imports fail first, at import.** The
|
|
27
|
-
left
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`ipor_fusion.fuses`);
|
|
26
|
+
1. **Removed and renamed imports fail first, at import.** The preview features
|
|
27
|
+
left the top level: crosschain names import from `ipor_fusion.crosschain`,
|
|
28
|
+
HyperCore names from the new `ipor_fusion.hypercore` (see
|
|
29
|
+
[Preview features leave the top level](#preview-features-leave-the-top-level));
|
|
30
|
+
the crosschain encoders left `ipor_fusion.fuses.crosschain` for
|
|
31
|
+
`ipor_fusion.crosschain.fuses` (no shim); the event decoder modules
|
|
32
|
+
`ipor_fusion.fuses.external_state_events` and `ipor_fusion.fuses.hypercore_events`
|
|
33
|
+
are renamed `external_state_event_decoding` and `hypercore_event_decoding` (import
|
|
34
|
+
the external-state names from `ipor_fusion` or `ipor_fusion.fuses`, the HyperCore
|
|
35
|
+
ones from `ipor_fusion.hypercore`); `IporFusionMarkets.RWA`, `MORPHO_BLUE_ADDRESS`, the 3.x cache
|
|
32
36
|
functions, `read_erc20_holdings`, `ExternalStateExecutor.mark_nav` and `NavMark`
|
|
33
37
|
are gone. See [Moved, removed and reshaped](#moved-removed-and-reshaped).
|
|
34
38
|
2. **Wrappers are built from an address; execution takes the context.**
|
|
@@ -309,14 +313,14 @@ vocabulary `Severity`, `Verdict` and `Check`. Also new: `InFlightLimit` (see
|
|
|
309
313
|
**Crosschain fuse encoders moved.** The crosschain market encoders moved from
|
|
310
314
|
`ipor_fusion.fuses.crosschain` into the crosschain package, and
|
|
311
315
|
`ipor_fusion.fuses` no longer re-exports them. There is no shim: the old paths
|
|
312
|
-
raise `ImportError`.
|
|
313
|
-
|
|
316
|
+
raise `ImportError`. They are not top-level names either (see the next
|
|
317
|
+
paragraph).
|
|
314
318
|
|
|
315
319
|
| 3.x import | 4.0 import |
|
|
316
320
|
|---|---|
|
|
317
321
|
| `ipor_fusion.fuses.crosschain` | `ipor_fusion.crosschain.fuses` (or `ipor_fusion.crosschain`) |
|
|
318
322
|
| `ipor_fusion.fuses.crosschain.base`, `.ccip`, `.stargate` | `ipor_fusion.crosschain.fuses` (its submodules `base`, `ccip` and `stargate` exist but are internal) |
|
|
319
|
-
| `from ipor_fusion.fuses import CcipCrosschainSupplyFuse` (and the other crosschain encoders, `SendParams`, `CrosschainSubstrate*`, `crosschain_market_id`) | `from ipor_fusion.crosschain import ...`
|
|
323
|
+
| `from ipor_fusion.fuses import CcipCrosschainSupplyFuse` (and the other crosschain encoders, `SendParams`, `CrosschainSubstrate*`, `crosschain_market_id`) | `from ipor_fusion.crosschain import ...` |
|
|
320
324
|
|
|
321
325
|
`ipor_fusion.crosschain` now exports the whole crosschain surface: besides the
|
|
322
326
|
codecs and wrappers, the encoders, `CrosschainLane`, `CcipLane`, `StargateLane`,
|
|
@@ -325,6 +329,41 @@ the transports and chains, `discover_deployment`, `open_lane(s)`, `LANES` and
|
|
|
325
329
|
`ipor_fusion.crosschain.ccip` and `.stargate` keep exporting only their codecs
|
|
326
330
|
and wrappers.
|
|
327
331
|
|
|
332
|
+
#### Preview features leave the top level
|
|
333
|
+
|
|
334
|
+
Crosschain and HyperCore are preview features (`PREVIEW_FEATURES`): their names
|
|
335
|
+
may change in a minor release, which the top level's major-only removal promise
|
|
336
|
+
could not hold. 4.0 exports them only from their subpackages.
|
|
337
|
+
|
|
338
|
+
- **Crosschain:** the 124 crosschain names import from `ipor_fusion.crosschain`,
|
|
339
|
+
or from `crosschain.ccip` / `crosschain.stargate` / `crosschain.fuses` as before.
|
|
340
|
+
That covers lanes, discovery, transports, encoders, wrappers, codecs and
|
|
341
|
+
`CrosschainSimulator`. It also covers the crosschain ids (`AssetId`, `CommandId`,
|
|
342
|
+
`MessageId`, `LayerZeroEid`, `CcipChainSelector`, ...), which still import from
|
|
343
|
+
`ipor_fusion.types` too.
|
|
344
|
+
- **HyperCore:** the 97 HyperCore names import from the new
|
|
345
|
+
`ipor_fusion.hypercore`. That covers the fuses and `HyperCoreSubstrates`, the
|
|
346
|
+
readers and `read_hypercore_*`, the event classes, specs and decoders, and the
|
|
347
|
+
ids (`HyperCoreAsset`, `HyperCoreTokenIndex`, `MarginTableId`, `PayloadHash`,
|
|
348
|
+
...). It also covers the constants and helpers (`SPOT_DEX`, `USDC_TOKEN_INDEX`,
|
|
349
|
+
`USDC_SYSTEM_ADDRESS`, `system_address`, `precompile_index_of`, `SettlementMode`,
|
|
350
|
+
`TimeInForce`, `TransferDirection`, ...). `HYPEREVM_CHAIN_ID` stays a top-level
|
|
351
|
+
chain constant. `ipor_fusion.fuses`
|
|
352
|
+
and `ipor_fusion.readers` no longer list them; the ids still import from
|
|
353
|
+
`ipor_fusion.types`.
|
|
354
|
+
- **Unchanged:** the exception classes (`HyperCoreEventDecodeError`,
|
|
355
|
+
`HyperCoreValuationError`, `CrosschainDiscoveryError`,
|
|
356
|
+
`VerifierResultUnavailable`, ...) stay top-level names of `ipor_fusion.errors`. The `vault info` document's HyperCore TypedDicts
|
|
357
|
+
(`HyperCoreJson`, ...) stay with the document.
|
|
358
|
+
- **Error registration:** `import ipor_fusion` no longer loads the crosschain
|
|
359
|
+
package. Import `ipor_fusion.crosschain` to register the crosschain contracts'
|
|
360
|
+
custom errors for decoding by name.
|
|
361
|
+
|
|
362
|
+
```python
|
|
363
|
+
from ipor_fusion.crosschain import CcipLane, discover_deployment, open_lanes
|
|
364
|
+
from ipor_fusion.hypercore import HyperCoreDepositFuse, read_hypercore_vault_state
|
|
365
|
+
```
|
|
366
|
+
|
|
328
367
|
**Fuse base.** `Fuse`, `StakeFuse` and the shared validators and substrate packers
|
|
329
368
|
moved to `ipor_fusion.core.fuse`. Import `Fuse` and `StakeFuse` from `ipor_fusion`
|
|
330
369
|
or `ipor_fusion.fuses`. `ipor_fusion.fuses.base` still re-exports them in 4.0, but
|
|
@@ -343,7 +382,8 @@ The internal `ipor_fusion.fuses.base` still re-exports them. The CLI's internal
|
|
|
343
382
|
from `ipor_fusion.fuses`, hid its submodule of the same name (`import
|
|
344
383
|
ipor_fusion.fuses.hypercore_events as m` bound the function); the external-state
|
|
345
384
|
module was renamed to match. Import the decoders with `from ipor_fusion import
|
|
346
|
-
external_state_events
|
|
385
|
+
external_state_events` and `from ipor_fusion.hypercore import hypercore_events`;
|
|
386
|
+
the modules are internal.
|
|
347
387
|
|
|
348
388
|
**Removed.**
|
|
349
389
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ipor-fusion
|
|
3
|
-
Version: 4.0.0.
|
|
3
|
+
Version: 4.0.0.dev215
|
|
4
4
|
Summary: The IPOR Fusion SDK for Python
|
|
5
5
|
Project-URL: homepage, https://ipor.io
|
|
6
6
|
Project-URL: repository, https://github.com/IPOR-Labs/ipor-fusion.py
|
|
@@ -388,8 +388,7 @@ renaming a name in it, or changing a signature incompatibly, waits for a major
|
|
|
388
388
|
release; adding one does not.
|
|
389
389
|
|
|
390
390
|
- **Public subpackages** declare their own `__all__`, each a subset of the top
|
|
391
|
-
level: `ipor_fusion.core`, `config`, `fuses
|
|
392
|
-
`crosschain.fuses`, `crosschain.ccip` and `crosschain.stargate`. `ipor_fusion.guide`
|
|
391
|
+
level: `ipor_fusion.core`, `config`, `fuses` and `readers`. `ipor_fusion.guide`
|
|
393
392
|
(the packaged docs) keeps its names in its own namespace.
|
|
394
393
|
- **Public modules** stay importable for the top-level names they define:
|
|
395
394
|
`about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`, `field_docs`,
|
|
@@ -404,8 +403,12 @@ release; adding one does not.
|
|
|
404
403
|
the subpackage or `ipor_fusion`), underscore names, and names in no `__all__`.
|
|
405
404
|
They change without notice; the CLI and the MCP server are stable as commands
|
|
406
405
|
and tools, not as Python modules.
|
|
407
|
-
- **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about
|
|
408
|
-
|
|
406
|
+
- **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
|
|
407
|
+
from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
|
|
408
|
+
`crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
|
|
409
|
+
from the top level, and may change in a minor release. Their exception classes
|
|
410
|
+
stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
|
|
411
|
+
(`HyperCoreJson`, ...) stay with the document.
|
|
409
412
|
- **Third-party types** are not re-exported: import `ChecksumAddress` and
|
|
410
413
|
`HexAddress` from `eth_typing`, and `BlockIdentifier`, `Timestamp` and `TxParams`
|
|
411
414
|
from `web3.types`. The SDK's own types (`ChainId`, `Amount`, `PlasmaVaultAddress`,
|
|
@@ -448,14 +451,6 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
|
|
|
448
451
|
| `ExternalStateExecutor` | NAV propose/confirm for off-vault capital (market 50); the executor's thresholds (`staleness_max`, `big_change_bps`, `dust_threshold`, `min_update_interval`), the live aggregate (`get_balance_fuse_snapshot`) and the pre-hook's staleness clock (`get_oldest_update_timestamp`) |
|
|
449
452
|
| `read_external_state`, `ExternalStateVaultState` | The market's vault-scoped state from the vault's ERC-7201 storage at one block: executor, the balance fuse's cached total, the custodian timestamp it last checked and the pause flag the pre-hook enforces (no getter exposes them) |
|
|
450
453
|
| `decode_external_state_event`, `EXTERNAL_STATE_TOPICS` | The ExternalState events the vault emits (big change, cache updates, unpause, rescue, executor creation and deployment, operation enter/exit), decoded by topic with their raw log identity; a malformed listed log raises |
|
|
451
|
-
| `decode_hypercore_event`, `hypercore_events` | **Preview.** The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
452
|
-
| `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | **Preview.** Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
|
|
453
|
-
| `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
|
|
454
|
-
| `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
|
|
455
|
-
| `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
|
|
456
|
-
| `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
|
|
457
|
-
| `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
|
|
458
|
-
| `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
|
|
459
454
|
| `erc20_balance_slot`, `VaultSimulator.with_erc20_balance` | Fund any address with any ERC-20 in a simulation by a storage override (slot found by probing), no holder to impersonate |
|
|
460
455
|
| `ERC20` | Token reads and approvals |
|
|
461
456
|
|
|
@@ -475,8 +470,24 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
|
|
|
475
470
|
| Merkl | `MerklClaimWrapperFuse` |
|
|
476
471
|
| Universal | `UniversalTokenSwapperFuse` |
|
|
477
472
|
| Off-vault capital | `AsyncActionFuse` (market 40), `ExternalStateOperationFuse` (market 50) |
|
|
478
|
-
|
|
479
|
-
|
|
473
|
+
|
|
474
|
+
### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
|
|
475
|
+
|
|
476
|
+
Not production (see the note at the top) and outside the stable top level:
|
|
477
|
+
import these from their subpackage, and expect changes in a minor release.
|
|
478
|
+
|
|
479
|
+
| Name | Purpose |
|
|
480
|
+
|------|---------|
|
|
481
|
+
| `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
|
|
482
|
+
| `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
|
|
483
|
+
| `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
|
|
484
|
+
| `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
|
|
485
|
+
| `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
|
|
486
|
+
| `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
|
|
487
|
+
| `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
|
|
488
|
+
| `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
489
|
+
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
490
|
+
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
|
|
480
491
|
|
|
481
492
|
The mainnet crosschain POC vault uses a keccak-derived market ID, not 54. Use
|
|
482
493
|
`crosschain_market_id("IPOR_FUSION_CROSSCHAIN_USDC_POC_V1")` for that deployment;
|
|
@@ -340,8 +340,7 @@ renaming a name in it, or changing a signature incompatibly, waits for a major
|
|
|
340
340
|
release; adding one does not.
|
|
341
341
|
|
|
342
342
|
- **Public subpackages** declare their own `__all__`, each a subset of the top
|
|
343
|
-
level: `ipor_fusion.core`, `config`, `fuses
|
|
344
|
-
`crosschain.fuses`, `crosschain.ccip` and `crosschain.stargate`. `ipor_fusion.guide`
|
|
343
|
+
level: `ipor_fusion.core`, `config`, `fuses` and `readers`. `ipor_fusion.guide`
|
|
345
344
|
(the packaged docs) keeps its names in its own namespace.
|
|
346
345
|
- **Public modules** stay importable for the top-level names they define:
|
|
347
346
|
`about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`, `field_docs`,
|
|
@@ -356,8 +355,12 @@ release; adding one does not.
|
|
|
356
355
|
the subpackage or `ipor_fusion`), underscore names, and names in no `__all__`.
|
|
357
356
|
They change without notice; the CLI and the MCP server are stable as commands
|
|
358
357
|
and tools, not as Python modules.
|
|
359
|
-
- **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about
|
|
360
|
-
|
|
358
|
+
- **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
|
|
359
|
+
from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
|
|
360
|
+
`crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
|
|
361
|
+
from the top level, and may change in a minor release. Their exception classes
|
|
362
|
+
stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
|
|
363
|
+
(`HyperCoreJson`, ...) stay with the document.
|
|
361
364
|
- **Third-party types** are not re-exported: import `ChecksumAddress` and
|
|
362
365
|
`HexAddress` from `eth_typing`, and `BlockIdentifier`, `Timestamp` and `TxParams`
|
|
363
366
|
from `web3.types`. The SDK's own types (`ChainId`, `Amount`, `PlasmaVaultAddress`,
|
|
@@ -400,14 +403,6 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
|
|
|
400
403
|
| `ExternalStateExecutor` | NAV propose/confirm for off-vault capital (market 50); the executor's thresholds (`staleness_max`, `big_change_bps`, `dust_threshold`, `min_update_interval`), the live aggregate (`get_balance_fuse_snapshot`) and the pre-hook's staleness clock (`get_oldest_update_timestamp`) |
|
|
401
404
|
| `read_external_state`, `ExternalStateVaultState` | The market's vault-scoped state from the vault's ERC-7201 storage at one block: executor, the balance fuse's cached total, the custodian timestamp it last checked and the pause flag the pre-hook enforces (no getter exposes them) |
|
|
402
405
|
| `decode_external_state_event`, `EXTERNAL_STATE_TOPICS` | The ExternalState events the vault emits (big change, cache updates, unpause, rescue, executor creation and deployment, operation enter/exit), decoded by topic with their raw log identity; a malformed listed log raises |
|
|
403
|
-
| `decode_hypercore_event`, `hypercore_events` | **Preview.** The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
404
|
-
| `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | **Preview.** Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
|
|
405
|
-
| `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
|
|
406
|
-
| `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
|
|
407
|
-
| `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
|
|
408
|
-
| `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
|
|
409
|
-
| `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
|
|
410
|
-
| `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
|
|
411
406
|
| `erc20_balance_slot`, `VaultSimulator.with_erc20_balance` | Fund any address with any ERC-20 in a simulation by a storage override (slot found by probing), no holder to impersonate |
|
|
412
407
|
| `ERC20` | Token reads and approvals |
|
|
413
408
|
|
|
@@ -427,8 +422,24 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
|
|
|
427
422
|
| Merkl | `MerklClaimWrapperFuse` |
|
|
428
423
|
| Universal | `UniversalTokenSwapperFuse` |
|
|
429
424
|
| Off-vault capital | `AsyncActionFuse` (market 40), `ExternalStateOperationFuse` (market 50) |
|
|
430
|
-
|
|
431
|
-
|
|
425
|
+
|
|
426
|
+
### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
|
|
427
|
+
|
|
428
|
+
Not production (see the note at the top) and outside the stable top level:
|
|
429
|
+
import these from their subpackage, and expect changes in a minor release.
|
|
430
|
+
|
|
431
|
+
| Name | Purpose |
|
|
432
|
+
|------|---------|
|
|
433
|
+
| `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
|
|
434
|
+
| `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
|
|
435
|
+
| `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
|
|
436
|
+
| `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
|
|
437
|
+
| `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
|
|
438
|
+
| `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
|
|
439
|
+
| `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
|
|
440
|
+
| `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
441
|
+
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
442
|
+
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
|
|
432
443
|
|
|
433
444
|
The mainnet crosschain POC vault uses a keccak-derived market ID, not 54. Use
|
|
434
445
|
`crosschain_market_id("IPOR_FUSION_CROSSCHAIN_USDC_POC_V1")` for that deployment;
|
|
@@ -73,43 +73,45 @@ from web3.types import BlockIdentifier, RPCEndpoint, Timestamp
|
|
|
73
73
|
|
|
74
74
|
from ipor_fusion import (
|
|
75
75
|
ERC20,
|
|
76
|
-
SPOT_DEX,
|
|
77
|
-
USDC_SYSTEM_ADDRESS,
|
|
78
|
-
USDC_TOKEN_INDEX,
|
|
79
76
|
AccountOverride,
|
|
80
|
-
CcipChain,
|
|
81
|
-
CcipChainSelector,
|
|
82
|
-
CcipCrosschainExecutor,
|
|
83
|
-
CcipTransport,
|
|
84
|
-
Command,
|
|
85
|
-
CrosschainLane,
|
|
86
|
-
CrosschainSimulator,
|
|
87
77
|
FuseAction,
|
|
88
|
-
HyperCoreReader,
|
|
89
|
-
LaneObservation,
|
|
90
78
|
PlasmaVault,
|
|
91
79
|
SimulationResult,
|
|
92
80
|
SubstrateInfo,
|
|
93
|
-
TimeInForce,
|
|
94
81
|
VaultSimulator,
|
|
95
82
|
Web3Context,
|
|
96
|
-
ccip_events,
|
|
97
83
|
decode_custom_error,
|
|
98
84
|
decode_substrate,
|
|
99
85
|
erc20_balance_slot,
|
|
100
|
-
open_lane,
|
|
101
86
|
parse_fuse_address,
|
|
102
87
|
parse_plasma_vault_address,
|
|
103
|
-
precompile_index_of,
|
|
104
|
-
quote_ccip_native_fee,
|
|
105
|
-
read_hypercore_evm_exit_ceiling,
|
|
106
|
-
read_hypercore_vault_state,
|
|
107
88
|
register_custom_errors,
|
|
108
89
|
)
|
|
109
|
-
from ipor_fusion.
|
|
90
|
+
from ipor_fusion.crosschain import (
|
|
91
|
+
CcipChain,
|
|
92
|
+
CcipChainSelector,
|
|
93
|
+
CcipCrosschainExecutor,
|
|
94
|
+
CcipTransport,
|
|
95
|
+
Command,
|
|
96
|
+
CrosschainLane,
|
|
97
|
+
CrosschainSimulator,
|
|
98
|
+
LaneObservation,
|
|
99
|
+
ccip_events,
|
|
100
|
+
open_lane,
|
|
101
|
+
quote_ccip_native_fee,
|
|
102
|
+
)
|
|
103
|
+
from ipor_fusion.hypercore import (
|
|
104
|
+
SPOT_DEX,
|
|
105
|
+
USDC_SYSTEM_ADDRESS,
|
|
106
|
+
USDC_TOKEN_INDEX,
|
|
110
107
|
HyperCoreDepositFuse,
|
|
111
108
|
HyperCoreOrderFuse,
|
|
109
|
+
HyperCoreReader,
|
|
112
110
|
HyperCoreSendFuse,
|
|
111
|
+
TimeInForce,
|
|
112
|
+
precompile_index_of,
|
|
113
|
+
read_hypercore_evm_exit_ceiling,
|
|
114
|
+
read_hypercore_vault_state,
|
|
113
115
|
)
|
|
114
116
|
from ipor_fusion.market_ids import IporFusionMarkets
|
|
115
117
|
from ipor_fusion.types import (
|
|
@@ -45,7 +45,7 @@ executors submit into HyperEVM's 3 M-gas small blocks. Every lifecycle message
|
|
|
45
45
|
here carries the factory route's 2 M and is executed automatically, but the
|
|
46
46
|
one-time dispatcher deployment ticket carries 6 M and has to be executed by
|
|
47
47
|
anyone through the permissionless ``OffRamp.execute``
|
|
48
|
-
(``ipor_fusion.manual_execution``). The deployment below already has its
|
|
48
|
+
(``ipor_fusion.crosschain.manual_execution``). The deployment below already has its
|
|
49
49
|
dispatcher; the relay delivers every message directly.
|
|
50
50
|
|
|
51
51
|
Run it (the shell snippets assume a POSIX shell -- bash or zsh):
|
|
@@ -70,6 +70,15 @@ from web3.types import Timestamp
|
|
|
70
70
|
|
|
71
71
|
from ipor_fusion import (
|
|
72
72
|
ERC20,
|
|
73
|
+
PlasmaVault,
|
|
74
|
+
SimulationResult,
|
|
75
|
+
VaultSimulator,
|
|
76
|
+
Web3Context,
|
|
77
|
+
erc20_balance_slot,
|
|
78
|
+
is_simulate_v1_supported,
|
|
79
|
+
parse_plasma_vault_address,
|
|
80
|
+
)
|
|
81
|
+
from ipor_fusion.crosschain import (
|
|
73
82
|
CcipChain,
|
|
74
83
|
CcipChainSelector,
|
|
75
84
|
CcipTransport,
|
|
@@ -77,14 +86,7 @@ from ipor_fusion import (
|
|
|
77
86
|
CrosschainLane,
|
|
78
87
|
CrosschainSimulator,
|
|
79
88
|
LaneObservation,
|
|
80
|
-
PlasmaVault,
|
|
81
|
-
SimulationResult,
|
|
82
|
-
VaultSimulator,
|
|
83
|
-
Web3Context,
|
|
84
|
-
erc20_balance_slot,
|
|
85
|
-
is_simulate_v1_supported,
|
|
86
89
|
open_lane,
|
|
87
|
-
parse_plasma_vault_address,
|
|
88
90
|
)
|
|
89
91
|
from ipor_fusion.market_ids import IporFusionMarkets
|
|
90
92
|
from ipor_fusion.types import Amount, ChainId, Decimals, Period, Shares
|
|
@@ -41,8 +41,13 @@ from eth_utils import function_signature_to_4byte_selector, keccak
|
|
|
41
41
|
from web3 import Web3
|
|
42
42
|
from web3.types import BlockData, LogReceipt, RPCEndpoint
|
|
43
43
|
|
|
44
|
-
from ipor_fusion import ERC20, Call, Web3Context
|
|
45
|
-
from ipor_fusion.crosschain import
|
|
44
|
+
from ipor_fusion import ERC20, Call, Web3Context
|
|
45
|
+
from ipor_fusion.crosschain import (
|
|
46
|
+
CcipCrosschainFactory,
|
|
47
|
+
CcipOffRamp,
|
|
48
|
+
CcipRouter,
|
|
49
|
+
ccip_token_lane,
|
|
50
|
+
)
|
|
46
51
|
from ipor_fusion.types import AssetId, CcipChainSelector, ChainId
|
|
47
52
|
|
|
48
53
|
T = TypeVar("T")
|