ipor-fusion 4.0.0.dev120__tar.gz → 4.0.0.dev122__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/AGENTS.md +4 -3
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/MIGRATION_4.md +6 -5
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/PKG-INFO +1 -1
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/validation.py +4 -3
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_data.py +4 -2
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_validation.py +50 -23
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/README.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/uv.lock +0 -0
|
@@ -429,9 +429,10 @@ are not validated.
|
|
|
429
429
|
everything validation and the ``vault info`` document need, so neither reads the
|
|
430
430
|
chain. The chain is `ctx.chain_id`; ``lending=False`` skips lending health, the
|
|
431
431
|
position breakdowns, their prices and the unpriceable check; ``metadata=False``
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
432
|
+
(`validate_vault`'s default) skips the display metadata (`token_symbols`,
|
|
433
|
+
`token_decimals`, the ERC20 holdings' symbols) but not the asset's symbol and
|
|
434
|
+
decimals or the decimals valuation needs; ``metadata=True`` reads it in one cached
|
|
435
|
+
Multicall3 batch that also names the ERC20 holdings. Add a new chain-state input to the snapshot, never a
|
|
435
436
|
read inside a renderer or validator.
|
|
436
437
|
- PlasmaVault serves governance/view functions via `fallback()` delegatecall to
|
|
437
438
|
PlasmaVaultBase, so Etherscan's ABI for the vault address omits callable
|
|
@@ -65,14 +65,15 @@ chain is always the context's:
|
|
|
65
65
|
the vault address (not a `PlasmaVault`) and no `chain_id`. It resolves one block
|
|
66
66
|
(``block``, else a numeric `ctx.default_block`, else the latest) and runs every
|
|
67
67
|
read, log scans included, on `ctx.at_block(block)`; `ctx` is not modified. The old
|
|
68
|
-
``chain_id=0`` switch is ``lending=False``; ``metadata=False``
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
68
|
+
``chain_id=0`` switch is ``lending=False``; ``metadata=False`` skips the
|
|
69
|
+
display metadata: `token_symbols` and `token_decimals` stay empty and the ERC20
|
|
70
|
+
holdings' symbols are `"?"`. The underlying asset's symbol and decimals and the
|
|
71
|
+
decimals the valuation needs are still read. With ``metadata=True`` the holdings
|
|
72
|
+
are named by the same cached, batched read as `token_symbols`. `VaultData` gains `vault`, `chain_id`, `market_balances`, `erc20`,
|
|
72
73
|
`token_symbols` and `token_decimals`; `WithdrawManagerData` gains
|
|
73
74
|
`shares_to_release_assets` and `pending_request_assets`.
|
|
74
75
|
- `validate_vault(ctx, vault, *, block=None, metadata=False)` fetches (by default
|
|
75
|
-
without
|
|
76
|
+
without display metadata) and validates; it no longer takes ``resolve_symbol``.
|
|
76
77
|
``metadata=True`` names the ERC20 holdings in the result and its findings. `validate_vault_state(state)` is
|
|
77
78
|
pure: a custom `VaultState` also provides `vault`, `chain_id`, `market_balances`,
|
|
78
79
|
`erc20` and the queue's `shares_to_release_assets`. `read_erc20_holdings` is gone:
|
|
@@ -245,9 +245,10 @@ def validate_vault(
|
|
|
245
245
|
else the context's numeric default block, else the latest) and validate
|
|
246
246
|
it; ``ctx`` itself is not modified.
|
|
247
247
|
|
|
248
|
-
The checks need no
|
|
249
|
-
|
|
250
|
-
cached
|
|
248
|
+
The checks need no display metadata, so by default the snapshot has no
|
|
249
|
+
`token_symbols` / `token_decimals` and the ERC20 holdings are named
|
|
250
|
+
``"?"``; ``metadata=True`` adds one batched, cached read that names them
|
|
251
|
+
in the holdings and findings."""
|
|
251
252
|
return validate_vault_state(
|
|
252
253
|
fetch_vault_data(ctx, vault, block=block, metadata=metadata)
|
|
253
254
|
)
|
|
@@ -549,8 +549,10 @@ def fetch_vault_data(
|
|
|
549
549
|
``lending=False`` skips lending health, the Morpho / Aave position
|
|
550
550
|
breakdowns, their token prices and the unpriceable-token check.
|
|
551
551
|
``metadata=False`` skips the token symbols and decimals the ``vault info``
|
|
552
|
-
document shows (validation does not need them) and
|
|
553
|
-
the ERC20 holdings are
|
|
552
|
+
document shows (validation does not need them): `token_symbols` and
|
|
553
|
+
`token_decimals` stay empty and the ERC20 holdings are named ``"?"``. The
|
|
554
|
+
underlying asset's symbol and decimals and the decimals the valuation needs
|
|
555
|
+
are read either way.
|
|
554
556
|
|
|
555
557
|
Raises `UnsupportedChainError` on a chain the tooling is not validated on
|
|
556
558
|
and `UnsupportedVaultVersionError` when the vault predates a getter the
|
|
@@ -8,7 +8,6 @@ depends on the CLI's fetch types.
|
|
|
8
8
|
from __future__ import annotations
|
|
9
9
|
|
|
10
10
|
import dataclasses
|
|
11
|
-
from concurrent.futures import ThreadPoolExecutor
|
|
12
11
|
from dataclasses import dataclass, field, replace
|
|
13
12
|
from typing import Any
|
|
14
13
|
from unittest.mock import MagicMock, patch
|
|
@@ -30,13 +29,14 @@ from ipor_fusion import (
|
|
|
30
29
|
VaultValidation,
|
|
31
30
|
Web3Context,
|
|
32
31
|
validate_vault,
|
|
32
|
+
vault_data,
|
|
33
33
|
)
|
|
34
34
|
from ipor_fusion.cache import NullCache
|
|
35
35
|
from ipor_fusion.core.oracle import price_oracle_middleware
|
|
36
36
|
from ipor_fusion.market_ids import IporFusionMarkets
|
|
37
37
|
from ipor_fusion.types import ChainId, MarketId
|
|
38
38
|
from ipor_fusion.validation import GET_MARKET_SUBSTRATES, Reconciliation
|
|
39
|
-
from ipor_fusion.vault_data import
|
|
39
|
+
from ipor_fusion.vault_data import VaultData, _MarketReads
|
|
40
40
|
from ipor_fusion.vault_erc20 import _Asset, _erc20_holdings, _read_erc20_market
|
|
41
41
|
|
|
42
42
|
|
|
@@ -444,10 +444,12 @@ class TestReadErc20Holdings:
|
|
|
444
444
|
|
|
445
445
|
|
|
446
446
|
class TestSnapshotTokenMetadata:
|
|
447
|
-
"""`fetch_vault_data`'s
|
|
448
|
-
|
|
447
|
+
"""`fetch_vault_data`'s optional token metadata. The vault, fee, queue,
|
|
448
|
+
role and market pipelines (the underlying asset's symbol and decimals
|
|
449
|
+
among them) are stubbed; the ERC20 market and the metadata batch run on
|
|
450
|
+
the fake chain, whose code reads raise."""
|
|
449
451
|
|
|
450
|
-
def
|
|
452
|
+
def _fetch(self, *, metadata: bool) -> tuple[_Chain, VaultData]:
|
|
451
453
|
state = _erc20_state()
|
|
452
454
|
chain = _Chain()
|
|
453
455
|
ctx = Web3Context(chain.web3(), ChainId(1), cache=NullCache())
|
|
@@ -459,44 +461,69 @@ class TestSnapshotTokenMetadata:
|
|
|
459
461
|
market_balances=chain.market_balances, # type: ignore[arg-type]
|
|
460
462
|
)
|
|
461
463
|
vault_reads = {
|
|
464
|
+
"share_decimals": 18,
|
|
465
|
+
"total_assets": state.total_assets,
|
|
466
|
+
"total_supply": state.total_assets,
|
|
467
|
+
"supply_cap": state.total_assets,
|
|
462
468
|
"asset": ASSET,
|
|
469
|
+
"access_manager": _addr("ac"),
|
|
470
|
+
"price_oracle": ORACLE,
|
|
471
|
+
"fuses": [FUSE],
|
|
472
|
+
"instant_fuses": [],
|
|
473
|
+
"vault_name": "Vault",
|
|
474
|
+
"rewards_manager": None,
|
|
463
475
|
"asset_decimals": state.asset_decimals,
|
|
476
|
+
"underlying_balance_on_vault": state.underlying_balance_on_vault,
|
|
477
|
+
"asset_symbol": "USDC",
|
|
464
478
|
"asset_price_usd": state.asset_price_usd,
|
|
479
|
+
"fuse_markets": None,
|
|
480
|
+
"unimplemented_getters": [],
|
|
465
481
|
}
|
|
466
|
-
|
|
467
|
-
|
|
482
|
+
oracle = price_oracle_middleware(ctx, ORACLE) # type: ignore[arg-type]
|
|
483
|
+
with (
|
|
484
|
+
patch.object(vault_data, "_block_timestamp", return_value=1),
|
|
485
|
+
patch.object(
|
|
486
|
+
vault_data, "_fetch_vault_reads", return_value=(vault_reads, oracle)
|
|
487
|
+
),
|
|
488
|
+
patch.object(vault_data, "_fetch_fee_data", return_value=None),
|
|
489
|
+
patch.object(
|
|
490
|
+
vault_data, "_fetch_withdraw_manager", return_value=(None, None)
|
|
491
|
+
),
|
|
492
|
+
patch.object(vault_data, "_fetch_role_accounts", return_value=None),
|
|
493
|
+
patch.object(vault_data, "_fetch_market_reads", return_value=markets),
|
|
494
|
+
patch.object(vault_data, "_fetch_hypercore_state", return_value=None),
|
|
495
|
+
):
|
|
496
|
+
data = vault_data.fetch_vault_data(
|
|
468
497
|
ctx,
|
|
469
|
-
pool,
|
|
470
498
|
VAULT, # type: ignore[arg-type]
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
markets,
|
|
474
|
-
None,
|
|
499
|
+
block=123,
|
|
500
|
+
lending=False,
|
|
475
501
|
metadata=metadata,
|
|
476
502
|
)
|
|
477
|
-
return chain,
|
|
503
|
+
return chain, data
|
|
478
504
|
|
|
479
|
-
def
|
|
480
|
-
chain,
|
|
505
|
+
def test_without_metadata_no_token_symbol_is_read(self):
|
|
506
|
+
chain, data = self._fetch(metadata=False)
|
|
481
507
|
|
|
482
508
|
assert chain.symbol_reads == 0
|
|
483
|
-
assert
|
|
484
|
-
erc20
|
|
485
|
-
assert [t.
|
|
486
|
-
assert erc20.value_in_asset == 11 * WAD
|
|
509
|
+
assert (data.token_symbols, data.token_decimals) == ({}, {})
|
|
510
|
+
assert [t.symbol for t in data.erc20.tokens] == ["?", "?", "?"]
|
|
511
|
+
assert [t.decimals for t in data.erc20.tokens] == [18, 18, 18]
|
|
512
|
+
assert data.erc20.value_in_asset == 11 * WAD
|
|
513
|
+
assert data.asset_symbol == "USDC"
|
|
487
514
|
|
|
488
515
|
def test_metadata_names_the_holdings_in_one_batch(self):
|
|
489
|
-
chain,
|
|
516
|
+
chain, data = self._fetch(metadata=True)
|
|
490
517
|
|
|
491
|
-
without, _ = self.
|
|
518
|
+
without, _ = self._fetch(metadata=False)
|
|
492
519
|
assert chain.symbol_reads == 3
|
|
493
520
|
assert len(chain.blocks) == len(without.blocks) + 1
|
|
494
|
-
assert
|
|
521
|
+
assert data.token_symbols == {
|
|
495
522
|
ASSET.lower(): "",
|
|
496
523
|
TOKEN.lower(): "TKN",
|
|
497
524
|
OTHER.lower(): "",
|
|
498
525
|
}
|
|
499
|
-
assert [t.symbol for t in
|
|
526
|
+
assert [t.symbol for t in data.erc20.tokens] == ["?", "TKN", "?"]
|
|
500
527
|
|
|
501
528
|
|
|
502
529
|
class TestValidateVault:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/simple_aave_v3_supply_base.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_info_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_rendering.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fusion_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/rewards_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/lane.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/messages.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/transport.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state_events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/fluid_instadapp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/hypercore_events.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
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/compound_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|