ipor-fusion 4.1.0.dev50__tar.gz → 4.1.0.dev52__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.dev50 → ipor_fusion-4.1.0.dev52}/PKG-INFO +1 -1
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/pyproject.toml +1 -1
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_health.py +6 -1
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/validation.py +7 -2
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_erc20.py +11 -1
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_validation.py +33 -1
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.env.example +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.gemini/settings.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.gitignore +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/.python-version +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/AGENTS.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/CHANGELOG.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/CLAUDE.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/CODEOWNERS +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/LICENSE +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/MIGRATION_4.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/README.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/build.sh +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/README.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/hypercore_vault_official_deployment_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/pytest.ini +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/scripts/fusion_error_signatures.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/address_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/context_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/fuse_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/simulation_result.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/hypercore_pre_hooks.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fusion_errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/hypercore/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/preflight.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/registry.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_addresses.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_event_args.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_fake_rpc.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_foundry.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_golden.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_guide.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_live.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_multicall.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_oracle_mapping_fake.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_simulate.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/_validation.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/addresses.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/conftest.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/constants.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/hypercore_official.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/simulate_v1_request.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/fetched.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/full.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/full.txt +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_about.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_addresses_helper.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cache.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_chains.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_address.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_market_golden.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_mcp_parity.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_oracle_mapping_golden.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_preflight.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_docs_typing.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_examples_hypercore_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_fuse_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_fusion_errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_governance_wrappers.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_guide.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_pre_hooks.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_logs.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_address.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_preflight.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_preflight.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_public_type_reachability.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_registry.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_roles.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_examples_hyperevm.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_preflight_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_timelock_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulation_errors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_simulation_observation.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_data_block.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_info_fetched_golden.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_reconciliation_onchain_base.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/uv.lock +0 -0
|
@@ -12,6 +12,7 @@ from ipor_fusion.validation import (
|
|
|
12
12
|
VaultValidation,
|
|
13
13
|
)
|
|
14
14
|
from ipor_fusion.vault_data import VaultData
|
|
15
|
+
from ipor_fusion.vault_erc20 import ERC20_CACHE_TOLERANCE
|
|
15
16
|
from ipor_fusion.vault_info import health_check_lists
|
|
16
17
|
|
|
17
18
|
|
|
@@ -146,7 +147,11 @@ def _print_erc20_cache_divergence(
|
|
|
146
147
|
f"ERC20 direct={direct_fmt} — likely stale cache",
|
|
147
148
|
fg="yellow",
|
|
148
149
|
)
|
|
149
|
-
elif
|
|
150
|
+
elif (
|
|
151
|
+
cached > 0
|
|
152
|
+
and direct > 0
|
|
153
|
+
and abs(cached - direct) / direct > ERC20_CACHE_TOLERANCE
|
|
154
|
+
):
|
|
150
155
|
click.secho(
|
|
151
156
|
f" ERC20_VAULT_BALANCE cached={cached_fmt}, "
|
|
152
157
|
f"ERC20 direct={direct_fmt} — significant divergence",
|
|
@@ -43,6 +43,10 @@ from ipor_fusion.vault_data import (
|
|
|
43
43
|
GET_TOTAL_SUPPLY_CAP,
|
|
44
44
|
fetch_vault_data,
|
|
45
45
|
)
|
|
46
|
+
from ipor_fusion.vault_erc20 import (
|
|
47
|
+
ERC20_CACHE_TOLERANCE,
|
|
48
|
+
cache_lags_value,
|
|
49
|
+
)
|
|
46
50
|
from ipor_fusion.vault_erc20 import Erc20Holding as Erc20Holding
|
|
47
51
|
from ipor_fusion.vault_erc20 import Erc20Holdings as Erc20Holdings
|
|
48
52
|
|
|
@@ -704,7 +708,8 @@ def _erc20_findings(state: VaultState, erc20: Erc20Holdings) -> list[Finding]:
|
|
|
704
708
|
non_underlying = erc20.value_in_asset - underlying
|
|
705
709
|
cached = erc20.market_cached_value
|
|
706
710
|
if non_underlying > 0 and (
|
|
707
|
-
cached == 0
|
|
711
|
+
cached == 0
|
|
712
|
+
or abs(non_underlying - cached) / non_underlying > ERC20_CACHE_TOLERANCE
|
|
708
713
|
):
|
|
709
714
|
findings.append(
|
|
710
715
|
Finding(
|
|
@@ -747,7 +752,7 @@ def _uncovered_erc20_lines(state: VaultState, erc20: Erc20Holdings) -> list[str]
|
|
|
747
752
|
)
|
|
748
753
|
if address not in covered:
|
|
749
754
|
lines.append(f"{row} — not in any balance fuse substrate")
|
|
750
|
-
elif
|
|
755
|
+
elif cached_usd > 0 and cache_lags_value(token.usd_value or 0, cached_usd):
|
|
751
756
|
lines.append(
|
|
752
757
|
f"{row} — {usd.strip()} not reflected in totalAssets (stale cache)"
|
|
753
758
|
)
|
|
@@ -19,6 +19,16 @@ from ipor_fusion.market_ids import IporFusionMarkets
|
|
|
19
19
|
from ipor_fusion.substrates import decode_substrate
|
|
20
20
|
from ipor_fusion.types import Amount, Decimals, MarketId, PlasmaVaultAddress, Price
|
|
21
21
|
|
|
22
|
+
# The cached value is written at an earlier price and the live one is rounded,
|
|
23
|
+
# so the two never match exactly; a gap within this share of the live value is
|
|
24
|
+
# not staleness.
|
|
25
|
+
ERC20_CACHE_TOLERANCE = 0.1
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def cache_lags_value(usd_value: float, cached_usd: float) -> bool:
|
|
29
|
+
"""Whether a live USD value exceeds the market's cached value beyond tolerance."""
|
|
30
|
+
return usd_value - cached_usd > ERC20_CACHE_TOLERANCE * usd_value
|
|
31
|
+
|
|
22
32
|
|
|
23
33
|
@dataclass(frozen=True)
|
|
24
34
|
class Erc20Holding:
|
|
@@ -216,7 +226,7 @@ def _holding(
|
|
|
216
226
|
elif (
|
|
217
227
|
read.price_usd
|
|
218
228
|
and cached_usd is not None
|
|
219
|
-
and amount * read.price_usd
|
|
229
|
+
and cache_lags_value(amount * read.price_usd, cached_usd)
|
|
220
230
|
):
|
|
221
231
|
note = (
|
|
222
232
|
f"${amount * read.price_usd:,.2f} not reflected in totalAssets "
|
|
@@ -40,7 +40,13 @@ from ipor_fusion.market_ids import IporFusionMarkets
|
|
|
40
40
|
from ipor_fusion.types import ChainId, MarketId
|
|
41
41
|
from ipor_fusion.validation import GET_MARKET_SUBSTRATES, Reconciliation
|
|
42
42
|
from ipor_fusion.vault_data import VaultData, _MarketReads, _VaultReads
|
|
43
|
-
from ipor_fusion.vault_erc20 import
|
|
43
|
+
from ipor_fusion.vault_erc20 import (
|
|
44
|
+
_Asset,
|
|
45
|
+
_erc20_holdings,
|
|
46
|
+
_Erc20Market,
|
|
47
|
+
_read_erc20_market,
|
|
48
|
+
_TokenRead,
|
|
49
|
+
)
|
|
44
50
|
|
|
45
51
|
|
|
46
52
|
def _addr(suffix: str) -> str:
|
|
@@ -57,6 +63,11 @@ ORPHAN_FUSE = _addr("f5")
|
|
|
57
63
|
AAVE = IporFusionMarkets.AAVE_V3
|
|
58
64
|
MORPHO = IporFusionMarkets.MORPHO
|
|
59
65
|
ERC20_MARKET = IporFusionMarkets.ERC20_VAULT_BALANCE
|
|
66
|
+
# A token whose value matches the market's cached value but for float rounding.
|
|
67
|
+
ASSET_PRICE = 2594.826591677957
|
|
68
|
+
ROUNDED_BALANCE = 3663278943628990
|
|
69
|
+
ROUNDED_PRICE = 2269.8825
|
|
70
|
+
ROUNDED_CACHE = 3204535051949216
|
|
60
71
|
WAD = 10**18
|
|
61
72
|
|
|
62
73
|
|
|
@@ -276,6 +287,16 @@ class TestRouting:
|
|
|
276
287
|
assert heading == "ERC20 holdings not covered by balance fuses:"
|
|
277
288
|
assert [row.split()[0] for row in rows] == ["AAA", "BBB"]
|
|
278
289
|
|
|
290
|
+
def test_rounding_gap_to_the_cache_is_not_uncovered(self):
|
|
291
|
+
state = _erc20_state(asset_price_usd=ASSET_PRICE)
|
|
292
|
+
erc20 = Erc20Holdings(
|
|
293
|
+
tokens=(holding(TOKEN, balance=ROUNDED_BALANCE, price_usd=ROUNDED_PRICE),),
|
|
294
|
+
value_in_asset=ROUNDED_CACHE,
|
|
295
|
+
market_cached_value=ROUNDED_CACHE,
|
|
296
|
+
)
|
|
297
|
+
validation = validate(state, 100 * WAD, erc20)
|
|
298
|
+
assert "uncovered_erc20" not in [check for check, _ in _checks(validation)]
|
|
299
|
+
|
|
279
300
|
def test_stale_erc20_cache_and_missing_price_feed(self):
|
|
280
301
|
erc20 = Erc20Holdings(
|
|
281
302
|
value_in_asset=50 * WAD,
|
|
@@ -598,6 +619,17 @@ class TestReadErc20Holdings:
|
|
|
598
619
|
assert erc20.market_cached_value == 2 * WAD
|
|
599
620
|
assert erc20.unpriced_tokens == (f"{OTHER.lower()} (?)",)
|
|
600
621
|
|
|
622
|
+
def test_rounding_gap_to_the_cache_keeps_the_token_in_the_market(self):
|
|
623
|
+
erc20 = _erc20_holdings(
|
|
624
|
+
_Asset(ASSET, 18, ASSET_PRICE), # type: ignore[arg-type]
|
|
625
|
+
_Erc20Market( # type: ignore[arg-type]
|
|
626
|
+
ROUNDED_CACHE,
|
|
627
|
+
(_TokenRead(TOKEN, 18, ROUNDED_BALANCE, ROUNDED_PRICE),), # type: ignore[arg-type]
|
|
628
|
+
),
|
|
629
|
+
{},
|
|
630
|
+
)
|
|
631
|
+
assert erc20.tokens[0].note == "in ERC20_VAULT_BALANCE"
|
|
632
|
+
|
|
601
633
|
def test_symbols_name_the_holdings(self):
|
|
602
634
|
symbols = {a.lower(): a.lower()[-2:] for a in (ASSET, TOKEN, OTHER)}
|
|
603
635
|
erc20 = self._read(_erc20_state(), symbols)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/advanced_euler_v2_credit_market_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/external_state_executor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/simulation_result.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/layerzero.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/crosschain/stargate/transport.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/fluid_instadapp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/fuses/hypercore_pre_hooks.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping_nodes.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/oracle_mapping_reader.py
RENAMED
|
File without changes
|
{ipor_fusion-4.1.0.dev50 → ipor_fusion-4.1.0.dev52}/src/ipor_fusion/readers/position_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|