ipor-fusion 4.0.0.dev311__tar.gz → 4.0.0.dev319__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.dev311 → ipor_fusion-4.0.0.dev319}/AGENTS.md +15 -54
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/MIGRATION_4.md +49 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/PKG-INFO +19 -20
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/README.md +18 -19
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/README.md +15 -23
- ipor_fusion-4.0.0.dev319/examples/hypercore_vault_official_deployment_hyperevm.py +903 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/pytest.ini +0 -1
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/contract.py +13 -1
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/__init__.py +6 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/contracts.py +38 -5
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/events.py +125 -63
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/lane.py +5 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/transport.py +23 -9
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/contracts.py +12 -9
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/errors.py +72 -4
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/fuses/ccip.py +21 -3
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/lane.py +34 -2
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/messages.py +51 -12
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/simulation.py +4 -1
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/stargate/contracts.py +17 -4
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/stargate/lane.py +1 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/transport.py +14 -1
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/hypercore.py +0 -3
- ipor_fusion-4.0.0.dev319/tests/_crosschain.py +252 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_crosschain_lifecycle.py +20 -115
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_crosschain_recovery.py +7 -3
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_foundry.py +15 -5
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_hypercore_model.py +4 -5
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_hypercore_shadow.py +42 -13
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/conftest.py +0 -13
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/hypercore_official.json +5 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_contract_call.py +15 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_contract_encoder.py +1 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_ccip_events.py +36 -16
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_contracts.py +46 -15
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_encoding.py +69 -15
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_lane.py +53 -8
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_transport.py +13 -0
- ipor_fusion-4.0.0.dev319/tests/test_examples_hypercore_hyperevm.py +215 -0
- ipor_fusion-4.0.0.dev319/tests/test_hypercore_simulation.py +16 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_public_api.py +3 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_crosschain_hyperevm.py +86 -428
- ipor_fusion-4.0.0.dev319/tests/test_simulate_examples_hyperevm.py +128 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_solidity_compiler.py +3 -0
- ipor_fusion-4.0.0.dev311/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -1026
- ipor_fusion-4.0.0.dev311/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -707
- ipor_fusion-4.0.0.dev311/scripts/crosschain_readiness.py +0 -1129
- ipor_fusion-4.0.0.dev311/tests/_crosschain.py +0 -574
- ipor_fusion-4.0.0.dev311/tests/test_crosschain_readiness.py +0 -160
- ipor_fusion-4.0.0.dev311/tests/test_crosschain_readiness_report.py +0 -821
- ipor_fusion-4.0.0.dev311/tests/test_examples_composed_hypercore.py +0 -239
- ipor_fusion-4.0.0.dev311/tests/test_examples_crosschain.py +0 -138
- ipor_fusion-4.0.0.dev311/tests/test_hypercore_simulation.py +0 -176
- ipor_fusion-4.0.0.dev311/tests/test_readiness_selection.py +0 -84
- ipor_fusion-4.0.0.dev311/tests/test_simulate_crosschain_canary.py +0 -127
- ipor_fusion-4.0.0.dev311/tests/test_simulate_crosschain_hypercore.py +0 -385
- ipor_fusion-4.0.0.dev311/tests/test_simulate_crosschain_lifecycle.py +0 -18
- ipor_fusion-4.0.0.dev311/tests/test_simulate_examples_crosschain.py +0 -44
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/scripts/fusion_error_signatures.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/address_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/context_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/fuse_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/fusion_errors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/hypercore/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/preflight.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/registry.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_event_args.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_golden.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_live.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_address.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_mcp_parity.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_preflight.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_fuse_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_fusion_errors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_governance_wrappers.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_address.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_preflight.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_preflight.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_registry.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_preflight_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_timelock_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev311 → ipor_fusion-4.0.0.dev319}/uv.lock +0 -0
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
`ipor-fusion` is the Python SDK for IPOR Fusion Plasma Vaults: typed fuse
|
|
4
4
|
encoders, on-chain readers, and a `fusion` CLI plus `fusion-mcp` MCP server
|
|
5
5
|
built on the same SDK. Published to PyPI. It is a library and inspection
|
|
6
|
-
tooling, not an automation service.
|
|
7
|
-
read-only diagnostic run on demand, not a keeper or production monitor; any
|
|
8
|
-
scheduled run of it belongs to the monitoring repository.
|
|
6
|
+
tooling, not an automation service.
|
|
9
7
|
|
|
10
8
|
Related repositories (siblings, referenced by name; clone paths vary):
|
|
11
9
|
- [ipor-fusion](https://github.com/IPOR-Labs/ipor-fusion) — Solidity contracts, the source of truth for market ids, roles and substrates.
|
|
@@ -29,8 +27,6 @@ uv run ruff check ./ # lint: bandit S,
|
|
|
29
27
|
uv run pyright # types, basic mode, src + tests + examples + scripts
|
|
30
28
|
uv run pytest # all tests + coverage gate (fail_under = 98, mcp/ included)
|
|
31
29
|
uv run pytest -m "cli or mcp" --no-cov # CLI/MCP subset (the full suite is mostly offline too)
|
|
32
|
-
uv run pytest --run-readiness -m readiness --no-cov -rA # opt-in live Ethereum-hub POC checks
|
|
33
|
-
uv run python scripts/crosschain_readiness.py --output /tmp/crosschain-readiness.json # live Arbitrum/HyperEVM report
|
|
34
30
|
uv run pytest tests/test_fuse_encoding.py -k aave --no-cov # single file / test
|
|
35
31
|
UPDATE_GOLDEN=1 uv run pytest -k golden --no-cov # rewrite pinned CLI/MCP output (tests/fixtures/*_golden/)
|
|
36
32
|
uv lock --check # uv.lock in sync with pyproject.toml
|
|
@@ -74,33 +70,19 @@ public Solidity sources from GitHub). Skip only for an unavailable source; an
|
|
|
74
70
|
exception from the
|
|
75
71
|
SDK is a test failure, never a skip. Never print `.env` or a provider URL: they
|
|
76
72
|
embed API keys, so skip and fail messages carry the exception type only.
|
|
77
|
-
`HYPEREVM_PROVIDER_URL` is used by the HyperEVM
|
|
78
|
-
|
|
79
|
-
`test_simulate_crosschain_hyperevm.py` rehearses Arbitrum → HyperEVM on pinned blocks
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
`
|
|
84
|
-
that revision (the fuses are compiled from it); a checkout without `node_modules` also
|
|
73
|
+
`HYPEREVM_PROVIDER_URL` is used by the Arbitrum → HyperEVM rehearsal and the
|
|
74
|
+
HyperCore tests; general PR CI does not supply it.
|
|
75
|
+
`test_simulate_crosschain_hyperevm.py` rehearses Arbitrum → HyperEVM on pinned blocks
|
|
76
|
+
with a CCIP factory pair compiled from `FUSE_SOURCE_REVISION` (the contracts release
|
|
77
|
+
the official deployment was built from) and built inside the simulation; the SDK
|
|
78
|
+
supports only that release, so there is no live-pair generation. It needs
|
|
79
|
+
`IPOR_FUSION_CONTRACTS_DIR` at that revision; a checkout without `node_modules` also
|
|
85
80
|
needs `IPOR_FUSION_FOUNDRY_REMAPPINGS` for OpenZeppelin. `test_crosschain_ccip_events.py`
|
|
86
81
|
mirrors the CCIP event registry from a checkout at its own `CONTRACTS_REVISION`.
|
|
87
82
|
`test_solidity_compiler.py` unit-tests that compiler helper (`tests/_foundry.py`)
|
|
88
83
|
offline, with `forge` and `git` mocked. The checkout-based tests above skip when their
|
|
89
84
|
external prerequisites are unavailable. `test_hypercore_live.py`,
|
|
90
|
-
`test_hypercore_deployment.py`
|
|
91
|
-
`HYPEREVM_PROVIDER_URL` as well.
|
|
92
|
-
`test_simulate_crosschain_lifecycle.py` drives the mainnet POC deployment from
|
|
93
|
-
Ethereum to every spoke on every transport through `CrosschainLane` and
|
|
94
|
-
`CrosschainSimulator`; the fixtures (`Chain`, `Deployment`, `Spoke`, pinned
|
|
95
|
-
blocks) live in `tests/_crosschain.py`. A planned spoke (HyperEVM) is a
|
|
96
|
-
`pending` chain there and an `xfail(strict=True)` param until it is wired.
|
|
97
|
-
`test_simulate_crosschain_canary.py` runs the same lifecycle on `CANARY` and
|
|
98
|
-
`CANARY_V3`, the live Arbitrum → HyperEVM USDC canaries on the pilot-v2 and v3 CCIP
|
|
99
|
-
factory pairs, each pinned right after its last transaction, then checks the final gates and every delivery's receiver
|
|
100
|
-
gas against its route limit; a `Chain.simulated_gas_limit` lifts HyperEVM's 3 M
|
|
101
|
-
small-block pin to 30 M and `Deployment.ccip_debits_sent_amount` /
|
|
102
|
-
`attestation_zero_dust_sd` carry the executor generation's accounting into `Run`.
|
|
103
|
-
It needs `ARBITRUM_PROVIDER_URL` and `HYPEREVM_PROVIDER_URL`.
|
|
85
|
+
and `test_hypercore_deployment.py` need `HYPEREVM_PROVIDER_URL` as well.
|
|
104
86
|
HyperCore (market 55) cannot be simulated directly: the HyperEVM RPC ignores code
|
|
105
87
|
overrides at the precompile addresses `0x800`–`0x813`, and the public Hyperliquid RPC
|
|
106
88
|
has no `eth_simulateV1`. `tests/_hypercore_shadow.py` therefore compiles the HyperCore
|
|
@@ -110,33 +92,12 @@ CoreWriter constants redirected to ordinary addresses, proves the rest is identi
|
|
|
110
92
|
the deployed runtimes, and `tests/_hypercore_model.py` answers those addresses through
|
|
111
93
|
`VaultSimulator.with_state_override_provider`. Core never applies anything there: the
|
|
112
94
|
tests prove EVM validation under supplied Core state. `test_hypercore_simulation.py`
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
`
|
|
117
|
-
`
|
|
118
|
-
|
|
119
|
-
preconditions. Its `readiness` marker requires `--run-readiness`: ordinary runs
|
|
120
|
-
exclude it even with `-m sdk`. Known HyperEVM gaps are non-strict xfails restricted
|
|
121
|
-
to assertion failures, so availability improving is an XPASS, not broken CI.
|
|
122
|
-
Readiness RPC clients fail on missing/unreachable providers or wrong chain IDs;
|
|
123
|
-
they pin a snapshot per chain and do not require `eth_simulateV1`.
|
|
124
|
-
`scripts/crosschain_readiness.py` separately reports both Arbitrum/HyperEVM USDC
|
|
125
|
-
directions and the v3 factory pair's configuration (creation codes, routes, the
|
|
126
|
-
dispatcher deployment gas limit, the canary creator's allowance, balance and HyperEVM
|
|
127
|
-
big-block flag) with snapshot block numbers/hashes/timestamps. `hyperevm_delivery`
|
|
128
|
-
flags manual execution into HyperEVM per message kind: `manual_execution_required` for
|
|
129
|
-
commands and recalls (the hub route's `messageGasLimit`) and `dispatcher_deployment_manual`
|
|
130
|
-
for the one-time deployment ticket. A delivery above the 3 M small block is manual
|
|
131
|
-
unless every Chainlink executor seen delivering on HyperEVM's CCIP 2.0 OffRamp over
|
|
132
|
-
the last ~2 weeks (`chainlink_executors`: `ExecutionStateChanged` senders from every
|
|
133
|
-
source, the canary EOA excluded, at least 20 executions) sends into big blocks; a
|
|
134
|
-
ticket below a dispatcher creation's gas is manual regardless. The executor set is
|
|
135
|
-
derived on every run; `eth_usingBigBlocks` is read at the latest block.
|
|
136
|
-
Blocked availability is a successful observation, not acceptance; incomplete probes
|
|
137
|
-
fail. There is no GitHub workflow for it in this repository: run it locally with
|
|
138
|
-
the Arbitrum and HyperEVM provider URLs from `.env`. A `Spoke` declares which transports reach it;
|
|
139
|
-
the lifecycle matrix follows that.
|
|
95
|
+
pins the shadow guard offline. `test_simulate_examples_hyperevm.py` runs the HyperCore
|
|
96
|
+
example on the official deployment (`fixtures/hypercore_official.json`) at its pinned
|
|
97
|
+
block: the wiring needs only `HYPEREVM_PROVIDER_URL`; the Core leg also needs the source
|
|
98
|
+
directory at the fixture's `build.source_revision` and compiles with its
|
|
99
|
+
`build.optimizer_runs` (the deployed set reproduces only with that setting, not the
|
|
100
|
+
checkout's default profile), the pending reader included.
|
|
140
101
|
|
|
141
102
|
## Conventions
|
|
142
103
|
|
|
@@ -503,6 +503,55 @@ fails at run time:
|
|
|
503
503
|
`dataclasses.asdict` form) with every field parsed; use it instead of
|
|
504
504
|
`FusionInstance(**data)`, which passes raw strings into the role-typed fields.
|
|
505
505
|
|
|
506
|
+
#### Crosschain follows the released contracts
|
|
507
|
+
|
|
508
|
+
4.0 encodes and decodes the crosschain contracts of the 2026-10-21 contracts
|
|
509
|
+
release (`ipor-abi`: the CCIP and Stargate factories, fuses and NAV pre-hook at
|
|
510
|
+
one CREATE3 address on Arbitrum and HyperEVM). Earlier crosschain deployments
|
|
511
|
+
are not supported: their fuses reject the new calldata, their envelopes fail
|
|
512
|
+
the version check, and their dispatcher `observation()` raises
|
|
513
|
+
`UnsupportedContractVersionError`, so an earlier-generation lane is unreadable
|
|
514
|
+
on the spoke side.
|
|
515
|
+
|
|
516
|
+
- **Envelopes.** `CODEC_VERSION` is 4 (Stargate), `CCIP_VERSION` 3.
|
|
517
|
+
- **`Command`.** New `min_execution_gas` before `action_data` (0 = the lane's
|
|
518
|
+
default, at most `MAX_COMMAND_EXECUTION_GAS`); `as_tuple()` / `from_tuple()`
|
|
519
|
+
have six members and `COMMAND_TUPLE_TYPE` is
|
|
520
|
+
`(bytes32,uint64,uint64,uint8,uint64,bytes)`.
|
|
521
|
+
- **REQUEST_SHARES.** `Command.request_shares(withdraw_manager, vault, shares,
|
|
522
|
+
max_fee_shares)`: the fee ceiling in shares is required (`NO_FEE_CEILING` for
|
|
523
|
+
none).
|
|
524
|
+
- **CCIP supply.** `CcipSendParams.min_delivered` is the delivered-amount floor
|
|
525
|
+
the supply `enter` carries (0 = none, at most the amount).
|
|
526
|
+
`CcipCommandType.CANCEL_DEPLOYMENT` cancels an expired dispatcher deployment.
|
|
527
|
+
- **Observations.** `CcipObservation` gains `unpriced_count` and
|
|
528
|
+
`unpriced_codes` (`unpriced_reason(index)` returns a `TrackedVaultPricing`); the
|
|
529
|
+
Stargate `Observation` gains `vault_valued` and `unpriced_count`;
|
|
530
|
+
`LaneObservation` gains `unpriced_count`.
|
|
531
|
+
- **Attestation.** `CrosschainLane.attestation(...)` takes `receipt_at`, the hub's
|
|
532
|
+
`LaneHubState.last_value_moving_receipt_at` (0 on Stargate). The executor
|
|
533
|
+
refuses an observation that is not strictly later than its last value-moving
|
|
534
|
+
receipt; the method raises `ValueError` for it and while a tracked vault is
|
|
535
|
+
unpriced. New: `LaneHubState.last_value_moving_receipt_at`,
|
|
536
|
+
`CrosschainLane.last_value_moving_receipt_at()` (`None` on Stargate) and
|
|
537
|
+
`CcipCrosschainExecutor.last_value_moving_receipt_at`.
|
|
538
|
+
- **Core.** `Call` gains an optional `decode_error` field: a wrapper maps an
|
|
539
|
+
undecodable answer to a named SDK exception (the earlier-generation
|
|
540
|
+
`observation()` raises `UnsupportedContractVersionError` this way), and it
|
|
541
|
+
survives `Call.map()`.
|
|
542
|
+
- **Removed.** `CrosschainDispatcher.pending_request_shares` (neither released
|
|
543
|
+
dispatcher has it). From the repository: `scripts/crosschain_readiness.py`, the
|
|
544
|
+
pytest `--run-readiness` option and `readiness` marker, and the examples
|
|
545
|
+
`crosschain_ccip_usdc_arbitrum_hyperevm.py` and
|
|
546
|
+
`composed_hypercore_flow_arbitrum_hyperevm.py`, which drove an earlier
|
|
547
|
+
deployment.
|
|
548
|
+
- **Events and errors.** `CCIP_EVENTS` mirrors the released contracts:
|
|
549
|
+
`ReturnFinalized` / `LateReturnFinalized` gain `debitedSD`, `SharesRequested`
|
|
550
|
+
gains `feeShares`, and new events are registered. The crosschain error registry
|
|
551
|
+
decodes every error the released contracts declare.
|
|
552
|
+
- **Routes.** The released CCIP README requires a route `messageGasLimit` of at
|
|
553
|
+
least 2.7 M for commands.
|
|
554
|
+
|
|
506
555
|
## Errors
|
|
507
556
|
|
|
508
557
|
Every exception class the SDK defines now derives from `IporFusionError` and is
|
|
@@ -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.dev319
|
|
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
|
|
@@ -392,30 +392,29 @@ ever signed or broadcast.
|
|
|
392
392
|
- [External-state margin leg](https://github.com/IPOR-Labs/ipor-fusion.py/blob/main/examples/external_state_margin_leg_base.py) — a vault whose capital
|
|
393
393
|
sits off-chain: typed market-50 substrates, a dual-custodian propose/confirm marking the NAV,
|
|
394
394
|
the scheduled-withdrawal prep an alpha performs, and a mismatched confirmation being rejected.
|
|
395
|
-
- [
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
and
|
|
399
|
-
|
|
400
|
-
same hub funding a HyperCore vault (market 55) that trades on Hyperliquid Core: the Core leg
|
|
401
|
-
(bridge, dex transfer, order, close, exit) built from the vault's substrate grants and estimated
|
|
402
|
-
with `eth_estimateGas` at head (EVM acceptance only, Core executes later), the REDEEM sized by the vault's EVM exit ceiling behind the executor's
|
|
403
|
-
fee gate, then recall, residual attestation and claim replayed in `CrosschainSimulator` at
|
|
404
|
-
blocks pinned inside the second live cycle.
|
|
405
|
-
|
|
395
|
+
- [HyperCore vault on the official deployment](https://github.com/IPOR-Labs/ipor-fusion.py/blob/main/examples/hypercore_vault_official_deployment_hyperevm.py) —
|
|
396
|
+
a HyperEVM vault that trades on Hyperliquid Core (market 55, preview): wiring the published
|
|
397
|
+
HyperCore fuses, pre-hooks and grants on a factory clone, and building the Core leg (bridge,
|
|
398
|
+
dex transfers, an order and its reduce-only close, Core → EVM) as unsigned `execute` calldata.
|
|
399
|
+
Core execution is never simulated; see the example for what is.
|
|
406
400
|
```bash
|
|
407
401
|
export BASE_PROVIDER_URL="https://base-mainnet.g.alchemy.com/v2/YOUR_KEY"
|
|
408
402
|
uv run python examples/simple_aave_v3_supply_base.py
|
|
409
403
|
uv run python examples/advanced_euler_v2_credit_market_base.py
|
|
410
404
|
uv run python examples/external_state_margin_leg_base.py
|
|
411
|
-
uv run python examples/crosschain_ccip_usdc_arbitrum_hyperevm.py # needs ARBITRUM_PROVIDER_URL and HYPEREVM_PROVIDER_URL
|
|
412
|
-
uv run python examples/composed_hypercore_flow_arbitrum_hyperevm.py # same two providers
|
|
413
405
|
```
|
|
414
406
|
|
|
415
407
|
No RPC key? `BASE_PROVIDER_URL=https://mainnet.base.org` (Base's public RPC) runs the examples out of
|
|
416
408
|
the box — it supports `eth_simulateV1` and serves their pinned blocks. It is rate-limited, so use a
|
|
417
409
|
dedicated archive node for repeated or CI runs.
|
|
418
410
|
|
|
411
|
+
The HyperCore example runs on HyperEVM:
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
export HYPEREVM_PROVIDER_URL="https://YOUR_HYPEREVM_ARCHIVE_NODE"
|
|
415
|
+
uv run python examples/hypercore_vault_official_deployment_hyperevm.py
|
|
416
|
+
```
|
|
417
|
+
|
|
419
418
|
## Public API and stability
|
|
420
419
|
|
|
421
420
|
The supported API is `ipor_fusion.__all__`: import from `ipor_fusion`. Removing or
|
|
@@ -530,12 +529,12 @@ the pilot executors and factories). Pin an exact version if you depend on them.
|
|
|
530
529
|
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
531
530
|
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
|
|
532
531
|
|
|
533
|
-
The
|
|
534
|
-
`
|
|
535
|
-
|
|
536
|
-
`
|
|
537
|
-
|
|
538
|
-
passed.
|
|
532
|
+
The crosschain API supports only the contracts of the 2026-10-21 release; earlier
|
|
533
|
+
deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
|
|
534
|
+
take the market ID explicitly (54, or a keccak-derived one from
|
|
535
|
+
`crosschain_market_id(name)` for a vault built with its own): `discover_deployment`
|
|
536
|
+
reads the market's executor grants; `open_lane` takes an executor address and uses the
|
|
537
|
+
market ID to find the vault's matching fuses unless they are passed.
|
|
539
538
|
|
|
540
539
|
### Readers (`ipor_fusion.readers`)
|
|
541
540
|
|
|
@@ -343,30 +343,29 @@ ever signed or broadcast.
|
|
|
343
343
|
- [External-state margin leg](https://github.com/IPOR-Labs/ipor-fusion.py/blob/main/examples/external_state_margin_leg_base.py) — a vault whose capital
|
|
344
344
|
sits off-chain: typed market-50 substrates, a dual-custodian propose/confirm marking the NAV,
|
|
345
345
|
the scheduled-withdrawal prep an alpha performs, and a mismatched confirmation being rejected.
|
|
346
|
-
- [
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
and
|
|
350
|
-
|
|
351
|
-
same hub funding a HyperCore vault (market 55) that trades on Hyperliquid Core: the Core leg
|
|
352
|
-
(bridge, dex transfer, order, close, exit) built from the vault's substrate grants and estimated
|
|
353
|
-
with `eth_estimateGas` at head (EVM acceptance only, Core executes later), the REDEEM sized by the vault's EVM exit ceiling behind the executor's
|
|
354
|
-
fee gate, then recall, residual attestation and claim replayed in `CrosschainSimulator` at
|
|
355
|
-
blocks pinned inside the second live cycle.
|
|
356
|
-
|
|
346
|
+
- [HyperCore vault on the official deployment](https://github.com/IPOR-Labs/ipor-fusion.py/blob/main/examples/hypercore_vault_official_deployment_hyperevm.py) —
|
|
347
|
+
a HyperEVM vault that trades on Hyperliquid Core (market 55, preview): wiring the published
|
|
348
|
+
HyperCore fuses, pre-hooks and grants on a factory clone, and building the Core leg (bridge,
|
|
349
|
+
dex transfers, an order and its reduce-only close, Core → EVM) as unsigned `execute` calldata.
|
|
350
|
+
Core execution is never simulated; see the example for what is.
|
|
357
351
|
```bash
|
|
358
352
|
export BASE_PROVIDER_URL="https://base-mainnet.g.alchemy.com/v2/YOUR_KEY"
|
|
359
353
|
uv run python examples/simple_aave_v3_supply_base.py
|
|
360
354
|
uv run python examples/advanced_euler_v2_credit_market_base.py
|
|
361
355
|
uv run python examples/external_state_margin_leg_base.py
|
|
362
|
-
uv run python examples/crosschain_ccip_usdc_arbitrum_hyperevm.py # needs ARBITRUM_PROVIDER_URL and HYPEREVM_PROVIDER_URL
|
|
363
|
-
uv run python examples/composed_hypercore_flow_arbitrum_hyperevm.py # same two providers
|
|
364
356
|
```
|
|
365
357
|
|
|
366
358
|
No RPC key? `BASE_PROVIDER_URL=https://mainnet.base.org` (Base's public RPC) runs the examples out of
|
|
367
359
|
the box — it supports `eth_simulateV1` and serves their pinned blocks. It is rate-limited, so use a
|
|
368
360
|
dedicated archive node for repeated or CI runs.
|
|
369
361
|
|
|
362
|
+
The HyperCore example runs on HyperEVM:
|
|
363
|
+
|
|
364
|
+
```bash
|
|
365
|
+
export HYPEREVM_PROVIDER_URL="https://YOUR_HYPEREVM_ARCHIVE_NODE"
|
|
366
|
+
uv run python examples/hypercore_vault_official_deployment_hyperevm.py
|
|
367
|
+
```
|
|
368
|
+
|
|
370
369
|
## Public API and stability
|
|
371
370
|
|
|
372
371
|
The supported API is `ipor_fusion.__all__`: import from `ipor_fusion`. Removing or
|
|
@@ -481,12 +480,12 @@ the pilot executors and factories). Pin an exact version if you depend on them.
|
|
|
481
480
|
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
482
481
|
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
|
|
483
482
|
|
|
484
|
-
The
|
|
485
|
-
`
|
|
486
|
-
|
|
487
|
-
`
|
|
488
|
-
|
|
489
|
-
passed.
|
|
483
|
+
The crosschain API supports only the contracts of the 2026-10-21 release; earlier
|
|
484
|
+
deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
|
|
485
|
+
take the market ID explicitly (54, or a keccak-derived one from
|
|
486
|
+
`crosschain_market_id(name)` for a vault built with its own): `discover_deployment`
|
|
487
|
+
reads the market's executor grants; `open_lane` takes an executor address and uses the
|
|
488
|
+
market ID to find the vault's matching fuses unless they are passed.
|
|
490
489
|
|
|
491
490
|
### Readers (`ipor_fusion.readers`)
|
|
492
491
|
|
|
@@ -38,29 +38,21 @@ transaction.
|
|
|
38
38
|
brings the margin home and releases it for a user's scheduled withdrawal, then
|
|
39
39
|
demonstrates the executor rejecting a confirmation that does not match its
|
|
40
40
|
proposal.
|
|
41
|
-
- [`
|
|
42
|
-
a vault
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
`eth_estimateGas` at head -- six independent previews, EVM acceptance only --
|
|
57
|
-
with a balance override where the vault holds no USDC and sized to the live
|
|
58
|
-
Core inventory where the fuse checks a Core balance or dex equity, because
|
|
59
|
-
`eth_simulateV1` cannot run the HyperCore precompiles.
|
|
60
|
-
Part B replays the hub legs of the second live cycle in `CrosschainSimulator`
|
|
61
|
-
at pinned blocks: the REDEEM sized by `read_hypercore_evm_exit_ceiling` behind
|
|
62
|
-
the executor's maxFee gate, then recall, token return, the residual
|
|
63
|
-
attestation and the claim. Nothing is signed; it needs the same two RPCs.
|
|
41
|
+
- [`hypercore_vault_official_deployment_hyperevm.py`](hypercore_vault_official_deployment_hyperevm.py) --
|
|
42
|
+
a vault that is itself a Hyperliquid Core account (HyperCore, market 55; a
|
|
43
|
+
preview feature). No live vault uses the official HyperCore contracts yet, so
|
|
44
|
+
it clones a USDC vault from the official HyperEVM factory, wires the published
|
|
45
|
+
HyperCore fuses, balance fuse and pre-hooks with narrow market-55 grants, reads
|
|
46
|
+
the post-deployment checklist back, checks its constants against live Core
|
|
47
|
+
metadata at head, and builds the Core leg (EVM -> Core bridge, spot -> xyz dex,
|
|
48
|
+
an IOC order and its reduce-only close, dex -> spot, Core -> EVM) as unsigned
|
|
49
|
+
`execute` calldata. Core execution is never simulated, and the HyperCore read
|
|
50
|
+
precompiles do not run in `eth_simulateV1`: the default run stops before the
|
|
51
|
+
Core leg. Its RPC-gated test runs the Core leg too, with the fuses recompiled
|
|
52
|
+
from source against stand-in precompile answers (EVM acceptance only); it needs
|
|
53
|
+
`HYPEREVM_PROVIDER_URL`, `IPOR_FUSION_HYPERCORE_SOURCE_DIR` (an ipor-fusion
|
|
54
|
+
checkout at the release the deployment was built from) and `forge`, and skips
|
|
55
|
+
without them, which is how pull-request CI runs it.
|
|
64
56
|
|
|
65
57
|
## Prerequisites
|
|
66
58
|
|