ipor-fusion 4.1.0.dev14__tar.gz → 4.1.0.dev35__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.1.0.dev14 → ipor_fusion-4.1.0.dev35}/AGENTS.md +2 -1
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/MIGRATION_4.md +4 -1
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/PKG-INFO +2 -2
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/README.md +1 -1
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_credit_market_base.py +9 -10
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_looping_arbitrum.py +12 -11
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +19 -22
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/external_state_margin_leg_base.py +11 -10
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/hypercore_vault_official_deployment_hyperevm.py +21 -47
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/simple_aave_v3_supply_base.py +7 -6
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/pyproject.toml +1 -1
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/skills/ipor-deploy-vault/SKILL.md +3 -2
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/__init__.py +2 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/options.py +16 -20
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fusion_factory.py +4 -3
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/plasma_vault.py +2 -4
- ipor_fusion-4.1.0.dev35/src/ipor_fusion/fuses/hypercore_pre_hooks.py +89 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/quickstart.md +3 -2
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/hypercore/__init__.py +8 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/server.py +20 -6
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/types.py +25 -12
- ipor_fusion-4.1.0.dev35/tests/_addresses.py +17 -0
- ipor_fusion-4.1.0.dev35/tests/test_addresses_helper.py +20 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cache.py +1 -1
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_helpers.py +15 -12
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_hypercore_hyperevm.py +4 -15
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fusion_instance.py +3 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_flow.py +9 -19
- ipor_fusion-4.1.0.dev35/tests/test_hypercore_pre_hooks.py +72 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_preflight.py +9 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_server.py +25 -4
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_public_api.py +5 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_types_and_events.py +18 -4
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.env.example +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.gemini/settings.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.gitignore +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.python-version +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CHANGELOG.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CLAUDE.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CODEOWNERS +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/LICENSE +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/build.sh +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/README.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/pytest.ini +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/scripts/fusion_error_signatures.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/address_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/context_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fusion_errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/preflight.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/registry.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_event_args.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_foundry.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_golden.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_guide.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_live.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_multicall.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_simulate.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_validation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/addresses.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/conftest.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/constants.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_official.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_about.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_chains.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_address.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_mcp_parity.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_preflight.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fuse_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fusion_errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_governance_wrappers.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_guide.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_logs.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_address.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_preflight.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_registry.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_roles.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_preflight_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_timelock_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_validation.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/uv.lock +0 -0
|
@@ -281,7 +281,8 @@ checkout's default profile), the pending reader included.
|
|
|
281
281
|
`hypercore_event_decoding.py` (the ExternalState and HyperCore event specs, classes
|
|
282
282
|
and decoders; internal modules, the ExternalState names are exported from
|
|
283
283
|
`ipor_fusion.fuses`, the HyperCore ones from `ipor_fusion.hypercore`), `hypercore.py`
|
|
284
|
-
(the HyperCore fuses, market 55)
|
|
284
|
+
(the HyperCore fuses, market 55), `hypercore_pre_hooks.py` (the `PlasmaVault` call
|
|
285
|
+
that wires their pre-hooks);
|
|
285
286
|
`base.py` re-exports the `core/fuse.py` base and validators,
|
|
286
287
|
`FuseAction` and `ZERO_ADDRESS` (from `types`). A fuse is a value: equality and
|
|
287
288
|
hash cover its class and every attribute it stores
|
|
@@ -761,7 +761,7 @@ label values; they do not validate byte widths or address spelling.
|
|
|
761
761
|
| `RoleId` | a `Roles` member (accepted as is), or `RoleId(n)`; `Roles.resolve(name)` returns one |
|
|
762
762
|
| `Decimals`, `Period`, `Amount`, `Shares`, ... | `Decimals(8)`, `Period(0)`, `Amount(n)`, `Shares(n)` |
|
|
763
763
|
| `Wad` | `Wad(6 * 10**17)` (60%): an 18-decimal fraction, `10**18` is 100% |
|
|
764
|
-
| `ChecksumAddress` | `Web3.to_checksum_address(value)` |
|
|
764
|
+
| `ChecksumAddress` | `Web3.to_checksum_address(value)`, or from 4.1 `parse_checksum_address(value)`, which also rejects a wrong EIP-55 checksum |
|
|
765
765
|
| `HexAddress` | any `ChecksumAddress`, or `parse_hex_address(value)` (20 bytes or `0x`/`0X`-prefixed hex in any case → lowercase `0x` form) |
|
|
766
766
|
| `MorphoBlueMarketId` | `parse_morpho_market_id(value)`: 32 bytes or hex in any spelling, always `0x` + 64 lowercase digits |
|
|
767
767
|
| `TxHash` | `parse_tx_hash(value)` (32 bytes or `0x`/`0X`-prefixed hex in any case) |
|
|
@@ -775,6 +775,9 @@ The address and hash parsers (`parse_hex_address`, `parse_tx_hash`,
|
|
|
775
775
|
`parse_plasma_vault_address`, `parse_fuse_address`, `parse_access_manager_address`)
|
|
776
776
|
validate strictly: a string needs exactly one `0x`/`0X` prefix and the exact number of
|
|
777
777
|
hex digits, with no surrounding whitespace; anything else raises `ValueError`.
|
|
778
|
+
From 4.1 on, the checksumming ones (`parse_checksum_address` and the three role
|
|
779
|
+
parsers) also reject a mixed-case address whose EIP-55 checksum is wrong; an
|
|
780
|
+
all-lowercase or all-uppercase address carries no checksum and still parses.
|
|
778
781
|
Normalize user input first (see [Start here](#start-here)).
|
|
779
782
|
`parse_morpho_market_id` still accepts hex without `0x`.
|
|
780
783
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: ipor-fusion
|
|
3
|
-
Version: 4.1.0.
|
|
3
|
+
Version: 4.1.0.dev35
|
|
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
|
|
@@ -543,7 +543,7 @@ the pilot executors and factories). Pin an exact version if you depend on them.
|
|
|
543
543
|
| `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 |
|
|
544
544
|
| `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse events and the pending library's `HyperCoreActionEnqueued` / `HyperCoreActionSettled`, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
545
545
|
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
546
|
-
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state
|
|
546
|
+
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state`, the event decoders and `HyperCorePreHookWiring` (the capital-flow and pending-action pre-hooks on their selectors, `HYPERCORE_CAPITAL_FLOW_SELECTORS` / `HYPERCORE_PENDING_ACTION_SELECTORS`) |
|
|
547
547
|
|
|
548
548
|
The crosschain API supports only the contracts of the 2026-10-21 release; earlier
|
|
549
549
|
deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
|
|
@@ -494,7 +494,7 @@ the pilot executors and factories). Pin an exact version if you depend on them.
|
|
|
494
494
|
| `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 |
|
|
495
495
|
| `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse events and the pending library's `HyperCoreActionEnqueued` / `HyperCoreActionSettled`, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
|
|
496
496
|
| Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
|
|
497
|
-
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state
|
|
497
|
+
| HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state`, the event decoders and `HyperCorePreHookWiring` (the capital-flow and pending-action pre-hooks on their selectors, `HYPERCORE_CAPITAL_FLOW_SELECTORS` / `HYPERCORE_PENDING_ACTION_SELECTORS`) |
|
|
498
498
|
|
|
499
499
|
The crosschain API supports only the contracts of the 2026-10-21 release; earlier
|
|
500
500
|
deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
|
{ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_credit_market_base.py
RENAMED
|
@@ -62,6 +62,7 @@ from ipor_fusion import (
|
|
|
62
62
|
VaultSimulator,
|
|
63
63
|
Web3Context,
|
|
64
64
|
is_simulate_v1_supported,
|
|
65
|
+
parse_checksum_address,
|
|
65
66
|
parse_fuse_address,
|
|
66
67
|
)
|
|
67
68
|
from ipor_fusion.fuses import (
|
|
@@ -87,7 +88,7 @@ BASE_CHAIN_ID = ChainId(8453)
|
|
|
87
88
|
EULER_MARKET = IporFusionMarkets.EULER_V2
|
|
88
89
|
|
|
89
90
|
# IporFusionFactoryProxy on Base. Its clone(...) takes the six args in clone_args().
|
|
90
|
-
BASE_FUSION_FACTORY =
|
|
91
|
+
BASE_FUSION_FACTORY = parse_checksum_address(
|
|
91
92
|
"0x1455717668fA96534f675856347A973fA907e922"
|
|
92
93
|
)
|
|
93
94
|
|
|
@@ -116,20 +117,18 @@ EULER_BALANCE_FUSE = parse_fuse_address("0xF8A6AA09bB55f2319113b0DA88883F392e66A
|
|
|
116
117
|
# so they are not in the ipor-abi registry -- they are a live cbETH/WETH pair
|
|
117
118
|
# whose LTV allows the borrow below. The RPC-gated test asserts each eVault's
|
|
118
119
|
# IEVault.asset() equals the expected underlying, which is their provenance check.
|
|
119
|
-
EVAULT_CBETH =
|
|
120
|
-
EVAULT_WETH =
|
|
120
|
+
EVAULT_CBETH = parse_checksum_address("0x358f25F82644eaBb441d0df4AF8746614fb9ea49")
|
|
121
|
+
EVAULT_WETH = parse_checksum_address("0x859160DB5841E5cfB8D3f144C6b3381A85A4b410")
|
|
121
122
|
|
|
122
123
|
# Underlying assets of those eVaults (registry names "cbETH" / "wETH").
|
|
123
|
-
BASE_CBETH =
|
|
124
|
-
BASE_WETH =
|
|
124
|
+
BASE_CBETH = parse_checksum_address("0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22")
|
|
125
|
+
BASE_WETH = parse_checksum_address("0x4200000000000000000000000000000000000006")
|
|
125
126
|
|
|
126
127
|
# A Base address holding ample cbETH, used to fund the vault's collateral via an
|
|
127
128
|
# impersonated transfer inside the simulation. This is the Morpho Blue core
|
|
128
129
|
# contract (registry name "Morpho") -- a large, unrelated holder, so funding does
|
|
129
130
|
# not perturb the Euler markets the strategy uses.
|
|
130
|
-
BASE_CBETH_WHALE =
|
|
131
|
-
"0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"
|
|
132
|
-
)
|
|
131
|
+
BASE_CBETH_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
|
|
133
132
|
|
|
134
133
|
# ── Simulation parameters (safe to adjust) ───────────────────────────────────
|
|
135
134
|
#
|
|
@@ -152,10 +151,10 @@ BASE_CBETH_WHALE = Web3.to_checksum_address(
|
|
|
152
151
|
# focuses on the credit lifecycle rather than the deposit -> shares path.)
|
|
153
152
|
|
|
154
153
|
# Governance/atomist. Any address; here it happens to be a random EOA.
|
|
155
|
-
OWNER =
|
|
154
|
+
OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
156
155
|
|
|
157
156
|
# The alpha operator. Anvil account #0, a well-known test address.
|
|
158
|
-
ALPHA =
|
|
157
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
159
158
|
|
|
160
159
|
# One owner address controls 256 Euler sub-accounts; the vault's EVC account for
|
|
161
160
|
# this position is `plasma_vault XOR SUB_ACCOUNT`. Using a non-zero sub-account
|
{ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
@@ -47,6 +47,7 @@ from ipor_fusion import (
|
|
|
47
47
|
VaultSimulator,
|
|
48
48
|
Web3Context,
|
|
49
49
|
is_simulate_v1_supported,
|
|
50
|
+
parse_checksum_address,
|
|
50
51
|
parse_fuse_address,
|
|
51
52
|
)
|
|
52
53
|
from ipor_fusion.fuses import (
|
|
@@ -76,7 +77,7 @@ EULER_MARKET = IporFusionMarkets.EULER_V2
|
|
|
76
77
|
SWAPPER_MARKET = IporFusionMarkets.UNIVERSAL_TOKEN_SWAPPER_V2
|
|
77
78
|
MORPHO_FLASH_MARKET = IporFusionMarkets.MORPHO_FLASH_LOAN
|
|
78
79
|
|
|
79
|
-
ARBITRUM_FUSION_FACTORY =
|
|
80
|
+
ARBITRUM_FUSION_FACTORY = parse_checksum_address(
|
|
80
81
|
"0x134fCAce7a2C7Ef3dF2479B62f03ddabAEa922d5"
|
|
81
82
|
)
|
|
82
83
|
EULER_SUPPLY_FUSE = parse_fuse_address("0x920f6c81666877490A8D6dcFEFd85d151Ef04B7d")
|
|
@@ -96,34 +97,34 @@ UNIVERSAL_SWAPPER_FUSE_V2 = parse_fuse_address(
|
|
|
96
97
|
UNIVERSAL_SWAPPER_BALANCE_FUSE_V2 = parse_fuse_address(
|
|
97
98
|
"0x69199E8360b3Baa536Cda2bd71dFFb30F79fBeF7"
|
|
98
99
|
)
|
|
99
|
-
MORPHO_CALLBACK_HANDLER =
|
|
100
|
+
MORPHO_CALLBACK_HANDLER = parse_checksum_address(
|
|
100
101
|
"0x62E0A527fa7990183C4225f4565B2BfC925CD46e"
|
|
101
102
|
)
|
|
102
|
-
MORPHO =
|
|
103
|
+
MORPHO = parse_checksum_address("0x6c247b1F6182318877311737BaC0844bAa518F5e")
|
|
103
104
|
|
|
104
105
|
# Euler eVaults come from Euler's official Arbitrum Cluster deployment manifest.
|
|
105
106
|
# The RPC-gated test also checks each eVault's ``asset()`` at PINNED_BLOCK.
|
|
106
|
-
EVAULT_USDC =
|
|
107
|
-
EVAULT_WBTC =
|
|
107
|
+
EVAULT_USDC = parse_checksum_address("0x0a1eCC5Fe8C9be3C809844fcBe615B46A869b899")
|
|
108
|
+
EVAULT_WBTC = parse_checksum_address("0x889E1c458B2469b70aCcdfb5B59726dC1668896C")
|
|
108
109
|
|
|
109
|
-
ARBITRUM_USDC =
|
|
110
|
-
ARBITRUM_WBTC =
|
|
110
|
+
ARBITRUM_USDC = parse_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
|
|
111
|
+
ARBITRUM_WBTC = parse_checksum_address("0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f")
|
|
111
112
|
|
|
112
113
|
# Official Uniswap Universal Router deployment on Arbitrum. The 500-fee pool is
|
|
113
114
|
# verified on-chain in the RPC-gated test and is the deepest USDC/WBTC V3 pool at
|
|
114
115
|
# the pinned block.
|
|
115
|
-
UNISWAP_UNIVERSAL_ROUTER =
|
|
116
|
+
UNISWAP_UNIVERSAL_ROUTER = parse_checksum_address(
|
|
116
117
|
"0x5E325eDA8064b456f4781070C0738d849c824258"
|
|
117
118
|
)
|
|
118
119
|
UNISWAP_POOL_FEE = 500
|
|
119
|
-
UNISWAP_USDC_WBTC_POOL =
|
|
120
|
+
UNISWAP_USDC_WBTC_POOL = parse_checksum_address(
|
|
120
121
|
"0x0e4831319a50228b9e450861297ab92dee15b44f"
|
|
121
122
|
)
|
|
122
123
|
|
|
123
124
|
# ── Simulation parameters (safe to adjust) ───────────────────────────────────
|
|
124
125
|
|
|
125
|
-
OWNER =
|
|
126
|
-
ALPHA =
|
|
126
|
+
OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
127
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
127
128
|
SUB_ACCOUNT = 0x01
|
|
128
129
|
|
|
129
130
|
INITIAL_WBTC = Amount(10_000_000) # 0.10 WBTC, the unlevered equity
|
|
@@ -113,6 +113,7 @@ from ipor_fusion import (
|
|
|
113
113
|
Web3Context,
|
|
114
114
|
erc20_balance_slot,
|
|
115
115
|
is_simulate_v1_supported,
|
|
116
|
+
parse_checksum_address,
|
|
116
117
|
parse_fuse_address,
|
|
117
118
|
)
|
|
118
119
|
from ipor_fusion.crosschain import (
|
|
@@ -151,10 +152,10 @@ ARBITRUM_CHAIN_ID = ChainId(42161)
|
|
|
151
152
|
HYPEREVM_CHAIN_ID = ChainId(999)
|
|
152
153
|
ARBITRUM_CCIP_SELECTOR = CcipChainSelector(4949039107694359620)
|
|
153
154
|
HYPEREVM_CCIP_SELECTOR = CcipChainSelector(2442541497099098535)
|
|
154
|
-
ARBITRUM_CCIP_ROUTER =
|
|
155
|
+
ARBITRUM_CCIP_ROUTER = parse_checksum_address(
|
|
155
156
|
"0x141fa059441E0ca23ce184B6A78bafD2A517DdE8"
|
|
156
157
|
)
|
|
157
|
-
HYPEREVM_CCIP_ROUTER =
|
|
158
|
+
HYPEREVM_CCIP_ROUTER = parse_checksum_address(
|
|
158
159
|
"0x13b3332b66389B1467CA6eBd6fa79775CCeF65ec"
|
|
159
160
|
)
|
|
160
161
|
|
|
@@ -162,17 +163,17 @@ HYPEREVM_CCIP_ROUTER = Web3.to_checksum_address(
|
|
|
162
163
|
# (developers.circle.com -> stablecoins -> USDC contract addresses). The USDC
|
|
163
164
|
# CCIP lane between them is a CCTP burn-and-mint lane, so the asset arrives as
|
|
164
165
|
# the same native token on the other side.
|
|
165
|
-
ARBITRUM_USDC =
|
|
166
|
-
HYPEREVM_USDC =
|
|
166
|
+
ARBITRUM_USDC = parse_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
|
|
167
|
+
HYPEREVM_USDC = parse_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
|
|
167
168
|
USDC_DECIMALS = Decimals(6)
|
|
168
169
|
|
|
169
170
|
# Chainlink USDC/USD feed proxies (data.chain.link -> feeds -> arbitrum ->
|
|
170
171
|
# mainnet -> usdc-usd, and hyperliquid -> hyperliquid -> usdc-usd; the standard
|
|
171
172
|
# feeds, not SVR). Each vault's price manager prices USDC from its chain's feed.
|
|
172
|
-
ARBITRUM_USDC_USD_FEED =
|
|
173
|
+
ARBITRUM_USDC_USD_FEED = parse_checksum_address(
|
|
173
174
|
"0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3"
|
|
174
175
|
)
|
|
175
|
-
HYPEREVM_USDC_USD_FEED =
|
|
176
|
+
HYPEREVM_USDC_USD_FEED = parse_checksum_address(
|
|
176
177
|
"0xA0Adc43ce7AfE3EE7d7eac3C994E178D0620223B"
|
|
177
178
|
)
|
|
178
179
|
|
|
@@ -180,10 +181,10 @@ HYPEREVM_USDC_USD_FEED = Web3.to_checksum_address(
|
|
|
180
181
|
# mainnet/mainnet-arbitrum-fusion/addresses.json and
|
|
181
182
|
# mainnet/mainnet-hyperevm-fusion/addresses.json. Their clone(...) creates the
|
|
182
183
|
# hub and the spoke vault.
|
|
183
|
-
ARBITRUM_FUSION_FACTORY =
|
|
184
|
+
ARBITRUM_FUSION_FACTORY = parse_checksum_address(
|
|
184
185
|
"0x134fCAce7a2C7Ef3dF2479B62f03ddabAEa922d5"
|
|
185
186
|
)
|
|
186
|
-
HYPEREVM_FUSION_FACTORY =
|
|
187
|
+
HYPEREVM_FUSION_FACTORY = parse_checksum_address(
|
|
187
188
|
"0x6bBc827F34b4e862d15215ABd4AC0E3886181665"
|
|
188
189
|
)
|
|
189
190
|
|
|
@@ -195,7 +196,7 @@ HYPEREVM_FUSION_FACTORY = Web3.to_checksum_address(
|
|
|
195
196
|
RELEASE_COMMIT = "10f0f8e4031980b6f130d4f6460c6f8edfbcab32"
|
|
196
197
|
# CcipCrosschainFactory: creates executors on the hub and dispatchers on the
|
|
197
198
|
# spoke, and carries the factory-to-factory deployment ticket.
|
|
198
|
-
CCIP_FACTORY =
|
|
199
|
+
CCIP_FACTORY = parse_checksum_address("0xAd84580810A4e498F5F13Ad8506F73782FB472FA")
|
|
199
200
|
# CcipCrosschainSupplyFuse, CcipCrosschainCommandFuse, CrosschainClaimFuse and
|
|
200
201
|
# CrosschainBalanceFuse, all bound to the CROSSCHAIN market (54).
|
|
201
202
|
CCIP_SUPPLY_FUSE = parse_fuse_address("0x00a20FD711083CcE9C9c4292762aFf79f78C48eb")
|
|
@@ -207,13 +208,13 @@ CROSSCHAIN_BALANCE_FUSE = parse_fuse_address(
|
|
|
207
208
|
# CrosschainNavValidationPreHook: closes the vault's share-price-sensitive entry
|
|
208
209
|
# points while any of its executors fails its NAV check (a stale attestation,
|
|
209
210
|
# a blocked chain, a stale transfer).
|
|
210
|
-
CROSSCHAIN_NAV_PRE_HOOK =
|
|
211
|
+
CROSSCHAIN_NAV_PRE_HOOK = parse_checksum_address(
|
|
211
212
|
"0xA17c7A5Ed994aA5FE99C22B37DeCBCbfb32FaFe3"
|
|
212
213
|
)
|
|
213
214
|
# The libraries the executor and the dispatcher link (source path, name,
|
|
214
215
|
# address), in the order Foundry's ``--libraries`` takes them.
|
|
215
216
|
RELEASE_LIBRARIES: tuple[tuple[str, str, ChecksumAddress], ...] = tuple(
|
|
216
|
-
(source, name,
|
|
217
|
+
(source, name, parse_checksum_address(address))
|
|
217
218
|
for source, name, address in (
|
|
218
219
|
(
|
|
219
220
|
"contracts/crosschain/ccip/lib/CcipRouteLib.sol",
|
|
@@ -277,7 +278,7 @@ DISPATCHER_CREATION_CODE_HASH = bytes.fromhex(
|
|
|
277
278
|
# The factory's owner on both chains, read from CcipCrosschainFactory.owner()
|
|
278
279
|
# (a Safe multisig). Only it configures the factory and allows executor
|
|
279
280
|
# creators; the example checks the read against this constant.
|
|
280
|
-
FACTORY_OWNER =
|
|
281
|
+
FACTORY_OWNER = parse_checksum_address("0xA74376157E78053275fdae4A6849B5C16F41A0B9")
|
|
281
282
|
|
|
282
283
|
# ``IporFusionMarkets.CROSSCHAIN``: the market the crosschain fuses are bound to.
|
|
283
284
|
CROSSCHAIN_MARKET = IporFusionMarkets.CROSSCHAIN
|
|
@@ -303,17 +304,13 @@ CROSSCHAIN_MARKET = IporFusionMarkets.CROSSCHAIN
|
|
|
303
304
|
# RESCUE_GUARDIAN -- can veto the executor's timelocked rescue actions,
|
|
304
305
|
# nothing else; the executor refuses it equal to the rescue
|
|
305
306
|
# admin (VAULT_OWNER).
|
|
306
|
-
VAULT_OWNER =
|
|
307
|
+
VAULT_OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
307
308
|
# Anvil accounts #0 to #4, well-known test addresses.
|
|
308
|
-
ALPHA =
|
|
309
|
-
DEPOSITOR =
|
|
310
|
-
BALANCE_PROPOSER =
|
|
311
|
-
|
|
312
|
-
)
|
|
313
|
-
BALANCE_APPROVER = Web3.to_checksum_address(
|
|
314
|
-
"0x90F79bf6EB2c4f870365E785982E1f101E93b906"
|
|
315
|
-
)
|
|
316
|
-
RESCUE_GUARDIAN = Web3.to_checksum_address("0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65")
|
|
309
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
310
|
+
DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
|
|
311
|
+
BALANCE_PROPOSER = parse_checksum_address("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC")
|
|
312
|
+
BALANCE_APPROVER = parse_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b906")
|
|
313
|
+
RESCUE_GUARDIAN = parse_checksum_address("0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65")
|
|
317
314
|
|
|
318
315
|
# ── Adjustable simulation parameters ─────────────────────────────────────────
|
|
319
316
|
# Pinned after the released contracts were deployed, at the same timestamp on
|
{ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/external_state_margin_leg_base.py
RENAMED
|
@@ -99,6 +99,7 @@ from ipor_fusion import (
|
|
|
99
99
|
WithdrawManager,
|
|
100
100
|
WithdrawRequestInfo,
|
|
101
101
|
is_simulate_v1_supported,
|
|
102
|
+
parse_checksum_address,
|
|
102
103
|
parse_fuse_address,
|
|
103
104
|
)
|
|
104
105
|
from ipor_fusion.fuses import ExternalStateOperationFuse
|
|
@@ -116,7 +117,7 @@ BASE_CHAIN_ID = ChainId(8453)
|
|
|
116
117
|
|
|
117
118
|
# IporFusionFactoryProxy on Base. Its clone(...) takes the six arguments
|
|
118
119
|
# assembled in clone_args() below.
|
|
119
|
-
BASE_FUSION_FACTORY =
|
|
120
|
+
BASE_FUSION_FACTORY = parse_checksum_address(
|
|
120
121
|
"0x1455717668fA96534f675856347A973fA907e922"
|
|
121
122
|
)
|
|
122
123
|
|
|
@@ -125,7 +126,7 @@ BASE_FUSION_FACTORY = Web3.to_checksum_address(
|
|
|
125
126
|
# asset parked at the venue -- perp venues margin in USDC, and a venue that
|
|
126
127
|
# credits by sender needs the executor itself to send it, so a second asset plus
|
|
127
128
|
# a swap would only add a market this example does not need.
|
|
128
|
-
BASE_USDC =
|
|
129
|
+
BASE_USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
|
|
129
130
|
|
|
130
131
|
# External-state market (IporFusionMarkets.EXTERNAL_STATE).
|
|
131
132
|
EXTERNAL_STATE_MARKET = IporFusionMarkets.EXTERNAL_STATE
|
|
@@ -172,17 +173,17 @@ BASE_EXTERNAL_STATE_BALANCE_FUSE = parse_fuse_address(
|
|
|
172
173
|
# two addresses driven by one process buy nothing.
|
|
173
174
|
|
|
174
175
|
# Governance/atomist. Any address; here it happens to be a random EOA.
|
|
175
|
-
OWNER =
|
|
176
|
+
OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
176
177
|
|
|
177
178
|
# The alpha operator. Anvil account #0, a well-known test address.
|
|
178
|
-
ALPHA =
|
|
179
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
179
180
|
|
|
180
181
|
# The depositor -- the end user putting funds in. Anvil account #1.
|
|
181
|
-
DEPOSITOR =
|
|
182
|
+
DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
|
|
182
183
|
|
|
183
184
|
# The two custodians. Anvil accounts #2 and #3.
|
|
184
|
-
CUSTODIAN_A =
|
|
185
|
-
CUSTODIAN_B =
|
|
185
|
+
CUSTODIAN_A = parse_checksum_address("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC")
|
|
186
|
+
CUSTODIAN_B = parse_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b906")
|
|
186
187
|
|
|
187
188
|
# SIMULATION ONLY (placeholder addresses). Two distinct things, easy to conflate.
|
|
188
189
|
#
|
|
@@ -204,10 +205,10 @@ CUSTODIAN_B = Web3.to_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b9
|
|
|
204
205
|
# not reach. Pasting that address here would give it borrowed provenance: on Base
|
|
205
206
|
# it is an unrelated account, and a reader who copied it would send funds
|
|
206
207
|
# nowhere.
|
|
207
|
-
VENUE_DEPOSIT_ADDRESS =
|
|
208
|
+
VENUE_DEPOSIT_ADDRESS = parse_checksum_address(
|
|
208
209
|
"0x000000000000000000000000000000000000BEEF"
|
|
209
210
|
)
|
|
210
|
-
VENUE_BALANCE_ACCOUNT =
|
|
211
|
+
VENUE_BALANCE_ACCOUNT = parse_checksum_address(
|
|
211
212
|
"0x000000000000000000000000000000000000CAFE"
|
|
212
213
|
)
|
|
213
214
|
|
|
@@ -215,7 +216,7 @@ VENUE_BALANCE_ACCOUNT = Web3.to_checksum_address(
|
|
|
215
216
|
# impersonated transfer inside the simulation. Morpho Blue's core contract
|
|
216
217
|
# (~150M USDC) -- a protocol this example never touches, so funding cannot
|
|
217
218
|
# perturb the flow under test.
|
|
218
|
-
BASE_USDC_WHALE =
|
|
219
|
+
BASE_USDC_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
|
|
219
220
|
|
|
220
221
|
# Pinned Base block, after both external-state fuses were deployed. Pinning makes
|
|
221
222
|
# the simulation deterministic and immune to mainnet state drift. It requires an
|
|
@@ -96,6 +96,7 @@ from ipor_fusion import (
|
|
|
96
96
|
decode_substrate,
|
|
97
97
|
erc20_balance_slot,
|
|
98
98
|
is_simulate_v1_supported,
|
|
99
|
+
parse_checksum_address,
|
|
99
100
|
parse_fuse_address,
|
|
100
101
|
)
|
|
101
102
|
from ipor_fusion.hypercore import (
|
|
@@ -110,6 +111,7 @@ from ipor_fusion.hypercore import (
|
|
|
110
111
|
HyperCorePendingReader,
|
|
111
112
|
HyperCorePendingState,
|
|
112
113
|
HyperCorePerpAssetInfo,
|
|
114
|
+
HyperCorePreHookWiring,
|
|
113
115
|
HyperCoreReader,
|
|
114
116
|
HyperCoreSendFuse,
|
|
115
117
|
HyperCoreSubstrates,
|
|
@@ -138,7 +140,7 @@ log = logging.getLogger("hypercore_vault_official_deployment_hyperevm")
|
|
|
138
140
|
HYPEREVM_CHAIN_ID = ChainId(999)
|
|
139
141
|
|
|
140
142
|
# IporFusionFactoryProxy (implementation IporFusionFactoryImpl, factory version 10).
|
|
141
|
-
FUSION_FACTORY =
|
|
143
|
+
FUSION_FACTORY = parse_checksum_address("0x6bBc827F34b4e862d15215ABd4AC0E3886181665")
|
|
142
144
|
|
|
143
145
|
# BurnRequestFeeFuseV2: the fuse every factory clone starts with.
|
|
144
146
|
FACTORY_FEE_FUSE = parse_fuse_address("0xD62f398d36aeDE3992521EA9Fc501dEB418a50b4")
|
|
@@ -154,28 +156,28 @@ ORDER_FUSE = parse_fuse_address("0x96f97c088E9610A036a2738B004DF04Ee9Cf17a2")
|
|
|
154
156
|
# HyperCoreBalanceFuse: values the vault's Core account for market 55.
|
|
155
157
|
BALANCE_FUSE = parse_fuse_address("0xbEd25202529DCD2a05f7D8944B10779b6dbc6Fa6")
|
|
156
158
|
# HyperCoreCapitalFlowPreHook and HyperCorePendingActionPreHook.
|
|
157
|
-
CAPITAL_FLOW_PRE_HOOK =
|
|
159
|
+
CAPITAL_FLOW_PRE_HOOK = parse_checksum_address(
|
|
158
160
|
"0xbA999E8b50bDC2672CcE13A1F896aaD7Dc5BE547"
|
|
159
161
|
)
|
|
160
|
-
PENDING_ACTION_PRE_HOOK =
|
|
162
|
+
PENDING_ACTION_PRE_HOOK = parse_checksum_address(
|
|
161
163
|
"0xd240690cf7C41dDD75863c4b4a9358ea62B20c85"
|
|
162
164
|
)
|
|
163
165
|
# HyperCorePendingReader: the stateless helper the vault delegatecalls to report
|
|
164
166
|
# its pending-action record. The SDK's default for chain 999 is this address.
|
|
165
|
-
PENDING_READER =
|
|
167
|
+
PENDING_READER = parse_checksum_address("0x1EFFb12434f5fb59a636C54D8CBaC93b13DF1A9E")
|
|
166
168
|
|
|
167
169
|
# IporFusionPriceFeedUSD: a constant 1 USD price (8 decimals). The global price
|
|
168
170
|
# oracle middleware on HyperEVM has no USDC source, so the vault's own price
|
|
169
171
|
# manager must name one. A constant peg keeps this example's NAV arithmetic
|
|
170
172
|
# exact; a production vault picks its USDC feed in its oracle review (a market
|
|
171
173
|
# USDC/USD feed prices a depeg, a constant does not).
|
|
172
|
-
USD_PRICE_FEED =
|
|
174
|
+
USD_PRICE_FEED = parse_checksum_address("0x15794119c5D99Ed7997D1CE80DE8599e188547c5")
|
|
173
175
|
|
|
174
176
|
# Native Circle USDC on HyperEVM (6 decimals). Core token 0 is USDC; its
|
|
175
177
|
# ``tokenInfo(0).evmContract`` is Circle's CoreDepositWallet, whose ``token()`` is
|
|
176
178
|
# this ERC-20, so the SpotToken grant names this address, not the wallet
|
|
177
179
|
# (contracts/fuses/hypercore/README.md in ipor-fusion).
|
|
178
|
-
HYPEREVM_USDC =
|
|
180
|
+
HYPEREVM_USDC = parse_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
|
|
179
181
|
|
|
180
182
|
# xyz is HIP-3 perp dex 1, and xyz:NVDA is its market 2: action asset
|
|
181
183
|
# 100_000 + 1 * 10_000 + 2 in orders and grants, read index 10_002 for the
|
|
@@ -195,9 +197,9 @@ XYZ_NVDA_SZ_DECIMALS = 3
|
|
|
195
197
|
# refresh balances, and DEPOSITOR is an end user. OWNER and ALPHA must never
|
|
196
198
|
# share an address in production: a compromised alpha key would become
|
|
197
199
|
# governance, and on a HyperCore vault governance can re-wire the pre-hooks.
|
|
198
|
-
OWNER =
|
|
199
|
-
ALPHA =
|
|
200
|
-
DEPOSITOR =
|
|
200
|
+
OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
201
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
202
|
+
DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
|
|
201
203
|
|
|
202
204
|
# Pinned HyperEVM block, after the official HyperCore contracts and the factory
|
|
203
205
|
# upgrade. If your provider cannot serve state at this height, BUMP IT to a
|
|
@@ -234,22 +236,10 @@ MAX_ORDER_NOTIONAL_USD6 = 15_000_000
|
|
|
234
236
|
SEND_CAP_WEI = 10_000_000_000 # 100 USDC
|
|
235
237
|
NAV_JUMP_FLOOR_USD6 = 1_000_000 # 1 USD; the runbook sizes it per vault TVL
|
|
236
238
|
|
|
237
|
-
#
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
for signature in (
|
|
242
|
-
"deposit(uint256,address)",
|
|
243
|
-
"depositWithPermit(uint256,address,uint256,uint8,bytes32,bytes32)",
|
|
244
|
-
"mint(uint256,address)",
|
|
245
|
-
"withdraw(uint256,address,address)",
|
|
246
|
-
"redeem(uint256,address,address)",
|
|
247
|
-
"redeemFromRequest(uint256,address,address)",
|
|
248
|
-
)
|
|
249
|
-
)
|
|
250
|
-
PENDING_ACTION_SELECTORS = tuple(
|
|
251
|
-
function_signature_to_4byte_selector(signature)
|
|
252
|
-
for signature in ("execute((address,bytes)[])", "updateMarketsBalances(uint256[])")
|
|
239
|
+
# This deployment's two pre-hooks.
|
|
240
|
+
PRE_HOOKS = HyperCorePreHookWiring(
|
|
241
|
+
capital_flow_hook=CAPITAL_FLOW_PRE_HOOK,
|
|
242
|
+
pending_action_hook=PENDING_ACTION_PRE_HOOK,
|
|
253
243
|
)
|
|
254
244
|
|
|
255
245
|
|
|
@@ -340,18 +330,6 @@ def market_substrates(vault: PlasmaVaultAddress) -> list[bytes]:
|
|
|
340
330
|
]
|
|
341
331
|
|
|
342
332
|
|
|
343
|
-
def pre_hook_wiring() -> tuple[list[bytes], list[ChecksumAddress], list[list[bytes]]]:
|
|
344
|
-
"""``setPreHookImplementations`` arguments: the capital-flow hook on the six
|
|
345
|
-
share-priced selectors, the pending-action hook on ``execute`` and
|
|
346
|
-
``updateMarketsBalances``; neither hook takes substrates. A selector appears
|
|
347
|
-
once: a duplicate in one call silently keeps the last value."""
|
|
348
|
-
selectors = [*CAPITAL_FLOW_SELECTORS, *PENDING_ACTION_SELECTORS]
|
|
349
|
-
implementations = [CAPITAL_FLOW_PRE_HOOK] * len(CAPITAL_FLOW_SELECTORS) + [
|
|
350
|
-
PENDING_ACTION_PRE_HOOK
|
|
351
|
-
] * len(PENDING_ACTION_SELECTORS)
|
|
352
|
-
return selectors, implementations, [[] for _ in selectors]
|
|
353
|
-
|
|
354
|
-
|
|
355
333
|
def core_to_evm_amount(spot_total_wei: int) -> int:
|
|
356
334
|
"""Core wei to bridge back: spot minus the fee reserve, rounded down to a
|
|
357
335
|
multiple of 100 Core wei so the EVM amount is exact."""
|
|
@@ -675,9 +653,8 @@ def run_simulation(
|
|
|
675
653
|
|
|
676
654
|
# 3. The pre-hooks. The deposit fuse and opening orders revert unless all
|
|
677
655
|
# six share-priced selectors carry the capital-flow hook.
|
|
678
|
-
selectors, implementations, hook_substrates = pre_hook_wiring()
|
|
679
656
|
sim.add_call(
|
|
680
|
-
|
|
657
|
+
PRE_HOOKS.set_pre_hook_implementations(vault),
|
|
681
658
|
from_=OWNER,
|
|
682
659
|
label="set pre-hooks",
|
|
683
660
|
gas=CALL_GAS,
|
|
@@ -686,8 +663,10 @@ def run_simulation(
|
|
|
686
663
|
|
|
687
664
|
# The post-deployment checklist, read back from the wired vault.
|
|
688
665
|
wired_hooks = [
|
|
689
|
-
(selector, sim.observe(vault.get_pre_hook_implementation(selector)))
|
|
690
|
-
for selector in
|
|
666
|
+
(selector, expected, sim.observe(vault.get_pre_hook_implementation(selector)))
|
|
667
|
+
for selector, expected in zip(
|
|
668
|
+
PRE_HOOKS.selectors, PRE_HOOKS.implementations, strict=True
|
|
669
|
+
)
|
|
691
670
|
]
|
|
692
671
|
vault_refresh_role = sim.observe(
|
|
693
672
|
access_manager.has_role(Roles.UPDATE_MARKETS_BALANCES_ROLE, vault_address)
|
|
@@ -719,12 +698,7 @@ def run_simulation(
|
|
|
719
698
|
result = sim.run()
|
|
720
699
|
_assert_all_success(result)
|
|
721
700
|
|
|
722
|
-
for selector, implementation in wired_hooks:
|
|
723
|
-
expected = (
|
|
724
|
-
CAPITAL_FLOW_PRE_HOOK
|
|
725
|
-
if selector in CAPITAL_FLOW_SELECTORS
|
|
726
|
-
else PENDING_ACTION_PRE_HOOK
|
|
727
|
-
)
|
|
701
|
+
for selector, expected, implementation in wired_hooks:
|
|
728
702
|
_check(
|
|
729
703
|
implementation.value == expected,
|
|
730
704
|
f"selector 0x{selector.hex()} runs {implementation.value}, not {expected}",
|
|
@@ -51,6 +51,7 @@ from ipor_fusion import (
|
|
|
51
51
|
VaultSimulator,
|
|
52
52
|
Web3Context,
|
|
53
53
|
is_simulate_v1_supported,
|
|
54
|
+
parse_checksum_address,
|
|
54
55
|
parse_fuse_address,
|
|
55
56
|
)
|
|
56
57
|
from ipor_fusion.fuses import AaveV3SupplyFuse
|
|
@@ -68,13 +69,13 @@ BASE_CHAIN_ID = ChainId(8453)
|
|
|
68
69
|
|
|
69
70
|
# IporFusionFactoryProxy on Base. Its clone(...) takes the six arguments
|
|
70
71
|
# assembled in clone_args() below.
|
|
71
|
-
BASE_FUSION_FACTORY =
|
|
72
|
+
BASE_FUSION_FACTORY = parse_checksum_address(
|
|
72
73
|
"0x1455717668fA96534f675856347A973fA907e922"
|
|
73
74
|
)
|
|
74
75
|
|
|
75
76
|
# Native (Circle-issued) USDC on Base, 6 decimals. Not the bridged USDbC, a
|
|
76
77
|
# distinct ERC-20 with its own Aave market and price feed.
|
|
77
|
-
BASE_USDC =
|
|
78
|
+
BASE_USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
|
|
78
79
|
|
|
79
80
|
# Aave V3 market (IporFusionMarkets.AAVE_V3).
|
|
80
81
|
AAVE_MARKET = IporFusionMarkets.AAVE_V3
|
|
@@ -112,21 +113,21 @@ BASE_AAVE_V3_BALANCE_FUSE = parse_fuse_address(
|
|
|
112
113
|
# DEPOSITOR-- an end user; only ever holds and deposits funds.
|
|
113
114
|
|
|
114
115
|
# Governance/atomist. Any address; here it happens to be a random EOA.
|
|
115
|
-
OWNER =
|
|
116
|
+
OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
|
|
116
117
|
|
|
117
118
|
# The alpha operator. Anvil account #0, a well-known test address.
|
|
118
|
-
ALPHA =
|
|
119
|
+
ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
|
|
119
120
|
|
|
120
121
|
# The depositor -- the end user putting funds in. Never drives execute() and
|
|
121
122
|
# never holds a governance role. Anvil account #1, the natural sibling to the
|
|
122
123
|
# alpha's Anvil account #0.
|
|
123
|
-
DEPOSITOR =
|
|
124
|
+
DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
|
|
124
125
|
|
|
125
126
|
# A Base address holding ample USDC, used to fund the depositor via an
|
|
126
127
|
# impersonated transfer inside the simulation. This is the Morpho Blue core
|
|
127
128
|
# contract (~150M USDC) -- deliberately a different protocol from Aave, so
|
|
128
129
|
# funding does not perturb the market the strategy supplies into.
|
|
129
|
-
BASE_USDC_WHALE =
|
|
130
|
+
BASE_USDC_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
|
|
130
131
|
|
|
131
132
|
# Pinned Base block. Pinning makes the simulation deterministic and immune to
|
|
132
133
|
# mainnet state drift. It requires an archive node that can serve state at this
|
|
@@ -127,6 +127,7 @@ from ipor_fusion import (
|
|
|
127
127
|
PlasmaVault,
|
|
128
128
|
Roles,
|
|
129
129
|
Web3Context,
|
|
130
|
+
parse_checksum_address,
|
|
130
131
|
parse_fuse_address,
|
|
131
132
|
)
|
|
132
133
|
from ipor_fusion.fuses import AaveV3SupplyFuse
|
|
@@ -138,8 +139,8 @@ owner = Account.from_key(OWNER_PRIVATE_KEY).address # owns, configures and oper
|
|
|
138
139
|
ctx = Web3Context(w3, chain_id=ChainId(8453), signer=owner, private_key=OWNER_PRIVATE_KEY)
|
|
139
140
|
|
|
140
141
|
# Generic addresses are ChecksumAddress; fuse addresses carry their role (FuseAddress).
|
|
141
|
-
FACTORY_PROXY =
|
|
142
|
-
USDC =
|
|
142
|
+
FACTORY_PROXY = parse_checksum_address("0x1455717668fA96534f675856347A973fA907e922") # IporFusionFactoryProxy, Base
|
|
143
|
+
USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
|
|
143
144
|
SUPPLY_FUSE = parse_fuse_address("0x26fD6EF391E98C78CfCA27e00c3d15be4D941625") # SupplyFuseAaveV3, Base
|
|
144
145
|
BALANCE_FUSE = parse_fuse_address("0xf53f3EaFfDf67539256365cA7299540A98b60BA9") # BalanceFuseAaveV3, Base
|
|
145
146
|
|
|
@@ -387,6 +387,7 @@ from ipor_fusion.types import (
|
|
|
387
387
|
format_shares,
|
|
388
388
|
parse_access_manager_address,
|
|
389
389
|
parse_amount,
|
|
390
|
+
parse_checksum_address,
|
|
390
391
|
parse_fuse_address,
|
|
391
392
|
parse_hex_address,
|
|
392
393
|
parse_morpho_market_id,
|
|
@@ -709,6 +710,7 @@ __all__ = [
|
|
|
709
710
|
"FuseAddress",
|
|
710
711
|
"AccessManagerAddress",
|
|
711
712
|
"parse_access_manager_address",
|
|
713
|
+
"parse_checksum_address",
|
|
712
714
|
"parse_fuse_address",
|
|
713
715
|
"parse_hex_address",
|
|
714
716
|
"parse_plasma_vault_address",
|