ipor-fusion 4.0.0.dev116__tar.gz → 4.0.0.dev118__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.dev116 → ipor_fusion-4.0.0.dev118}/PKG-INFO +1 -1
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/context.py +22 -2
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_web3_context.py +98 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/AGENTS.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/MIGRATION_4.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/README.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/fuse.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/lane.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/messages.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/transport.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/types.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_managers.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_positions.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/vault_reads.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_error_hierarchy.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_fusion_instance.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_public_api.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/typed_client/consumer.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/tests/typed_client/rejected.py +0 -0
- {ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/uv.lock +0 -0
|
@@ -21,6 +21,7 @@ from web3.providers.rpc.utils import (
|
|
|
21
21
|
from web3.types import (
|
|
22
22
|
BlockIdentifier,
|
|
23
23
|
LogReceipt,
|
|
24
|
+
MakeBatchRequestFn,
|
|
24
25
|
MakeRequestFn,
|
|
25
26
|
RPCEndpoint,
|
|
26
27
|
RPCResponse,
|
|
@@ -192,7 +193,14 @@ class Web3Context:
|
|
|
192
193
|
# and leaves every other block untouched.
|
|
193
194
|
web3.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0)
|
|
194
195
|
if max_concurrent_requests is not None:
|
|
195
|
-
|
|
196
|
+
# Innermost (layer 0, injected last): a slot covers only the provider
|
|
197
|
+
# call, so a middleware that issues its own request (the gas price
|
|
198
|
+
# strategy reads a block) never waits on the slot it already holds.
|
|
199
|
+
web3.middleware_onion.inject(
|
|
200
|
+
_in_flight_limit(max_concurrent_requests),
|
|
201
|
+
name="in_flight_limit",
|
|
202
|
+
layer=0,
|
|
203
|
+
)
|
|
196
204
|
chain_id = ChainId(web3.eth.chain_id)
|
|
197
205
|
|
|
198
206
|
return cls(
|
|
@@ -411,7 +419,8 @@ class Web3Context:
|
|
|
411
419
|
|
|
412
420
|
def _in_flight_limit(limit: int) -> type[Web3Middleware]:
|
|
413
421
|
"""A middleware class (web3 instantiates it per Web3) holding a semaphore
|
|
414
|
-
slot for the duration of each provider
|
|
422
|
+
slot for the duration of each provider call; a JSON-RPC batch is one HTTP
|
|
423
|
+
request, so it takes one slot whatever its item count."""
|
|
415
424
|
if limit < 1:
|
|
416
425
|
raise ValueError(f"max_concurrent_requests must be at least 1, got {limit}")
|
|
417
426
|
slots = threading.BoundedSemaphore(limit)
|
|
@@ -424,4 +433,15 @@ def _in_flight_limit(limit: int) -> type[Web3Middleware]:
|
|
|
424
433
|
|
|
425
434
|
return limited
|
|
426
435
|
|
|
436
|
+
def wrap_make_batch_request(
|
|
437
|
+
self, make_batch_request: MakeBatchRequestFn
|
|
438
|
+
) -> MakeBatchRequestFn:
|
|
439
|
+
def limited(
|
|
440
|
+
requests_info: list[tuple[RPCEndpoint, Any]],
|
|
441
|
+
) -> list[RPCResponse] | RPCResponse:
|
|
442
|
+
with slots:
|
|
443
|
+
return make_batch_request(requests_info)
|
|
444
|
+
|
|
445
|
+
return limited
|
|
446
|
+
|
|
427
447
|
return InFlightLimit
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import threading
|
|
5
5
|
import time
|
|
6
6
|
from concurrent.futures import ThreadPoolExecutor
|
|
7
|
+
from typing import Any
|
|
7
8
|
from unittest.mock import MagicMock, patch
|
|
8
9
|
|
|
9
10
|
import pytest
|
|
@@ -671,6 +672,103 @@ class TestConcurrencyLimit:
|
|
|
671
672
|
def test_none_leaves_requests_unbounded(self):
|
|
672
673
|
assert self._peak(None) > 3
|
|
673
674
|
|
|
675
|
+
def test_a_nested_middleware_request_does_not_deadlock_at_limit_one(self):
|
|
676
|
+
"""web3's gas price strategy reads a block while handling
|
|
677
|
+
eth_sendTransaction; that nested request must not wait on the slot the
|
|
678
|
+
outer one would hold."""
|
|
679
|
+
block = {
|
|
680
|
+
"number": "0x1",
|
|
681
|
+
"hash": "0x" + "11" * 32,
|
|
682
|
+
"parentHash": "0x" + "22" * 32,
|
|
683
|
+
"timestamp": "0x1",
|
|
684
|
+
"baseFeePerGas": "0x1",
|
|
685
|
+
"transactions": [],
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
def make_request(provider, method, params):
|
|
689
|
+
result: Any = {
|
|
690
|
+
"eth_chainId": "0x1",
|
|
691
|
+
"eth_getBlockByNumber": block,
|
|
692
|
+
"eth_sendTransaction": "0x" + "ab" * 32,
|
|
693
|
+
}.get(method, "0x1")
|
|
694
|
+
return {"jsonrpc": "2.0", "id": 1, "result": result}
|
|
695
|
+
|
|
696
|
+
with patch.object(HTTPProvider, "make_request", make_request):
|
|
697
|
+
ctx = Web3Context.from_url(
|
|
698
|
+
"http://localhost:8545", max_concurrent_requests=1
|
|
699
|
+
)
|
|
700
|
+
done = threading.Event()
|
|
701
|
+
|
|
702
|
+
def send():
|
|
703
|
+
ctx.web3.eth.send_transaction(
|
|
704
|
+
{"from": ADDR, "to": ADDR, "gas": 21_000, "gasPrice": 1}
|
|
705
|
+
)
|
|
706
|
+
done.set()
|
|
707
|
+
|
|
708
|
+
worker = threading.Thread(target=send, daemon=True)
|
|
709
|
+
worker.start()
|
|
710
|
+
worker.join(timeout=2)
|
|
711
|
+
assert done.is_set()
|
|
712
|
+
|
|
713
|
+
def _batch_peak(self, limit: int) -> int:
|
|
714
|
+
in_flight = 0
|
|
715
|
+
peak = 0
|
|
716
|
+
lock = threading.Lock()
|
|
717
|
+
|
|
718
|
+
def make_request(provider, method, params):
|
|
719
|
+
return {"jsonrpc": "2.0", "id": 1, "result": "0x1"}
|
|
720
|
+
|
|
721
|
+
def make_batch_request(provider, requests):
|
|
722
|
+
nonlocal in_flight, peak
|
|
723
|
+
with lock:
|
|
724
|
+
in_flight += 1
|
|
725
|
+
peak = max(peak, in_flight)
|
|
726
|
+
time.sleep(0.02)
|
|
727
|
+
with lock:
|
|
728
|
+
in_flight -= 1
|
|
729
|
+
return [
|
|
730
|
+
{"jsonrpc": "2.0", "id": i, "result": "0x1"}
|
|
731
|
+
for i, _ in enumerate(requests)
|
|
732
|
+
]
|
|
733
|
+
|
|
734
|
+
with (
|
|
735
|
+
patch.object(HTTPProvider, "make_request", make_request),
|
|
736
|
+
patch.object(HTTPProvider, "make_batch_request", make_batch_request),
|
|
737
|
+
):
|
|
738
|
+
ctx = Web3Context.from_url(
|
|
739
|
+
"http://localhost:8545", max_concurrent_requests=limit
|
|
740
|
+
)
|
|
741
|
+
|
|
742
|
+
def one_batch(_):
|
|
743
|
+
with ctx.web3.batch_requests() as batch:
|
|
744
|
+
batch.add(ctx.web3.eth.get_block_number())
|
|
745
|
+
return batch.execute()
|
|
746
|
+
|
|
747
|
+
with ThreadPoolExecutor(8) as pool:
|
|
748
|
+
list(pool.map(one_batch, range(16)))
|
|
749
|
+
return peak
|
|
750
|
+
|
|
751
|
+
def test_batches_take_one_slot_each_within_the_limit(self):
|
|
752
|
+
assert self._batch_peak(2) <= 2
|
|
753
|
+
|
|
754
|
+
def test_a_failed_request_releases_its_slot(self):
|
|
755
|
+
calls = 0
|
|
756
|
+
|
|
757
|
+
def make_request(provider, method, params):
|
|
758
|
+
nonlocal calls
|
|
759
|
+
calls += 1
|
|
760
|
+
if calls == 2:
|
|
761
|
+
raise ConnectionError("dropped")
|
|
762
|
+
return {"jsonrpc": "2.0", "id": 1, "result": "0x1"}
|
|
763
|
+
|
|
764
|
+
with patch.object(HTTPProvider, "make_request", make_request):
|
|
765
|
+
ctx = Web3Context.from_url(
|
|
766
|
+
"http://localhost:8545", max_concurrent_requests=1
|
|
767
|
+
)
|
|
768
|
+
with pytest.raises(ConnectionError):
|
|
769
|
+
ctx.web3.eth.block_number # noqa: B018
|
|
770
|
+
assert ctx.web3.eth.block_number == 1
|
|
771
|
+
|
|
674
772
|
def test_a_limit_below_one_is_rejected(self):
|
|
675
773
|
with (
|
|
676
774
|
patch.object(HTTPProvider, "make_request"),
|
|
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.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/advanced_euler_v2_looping_arbitrum.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/examples/external_state_margin_leg_base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/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.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/oracle_mapping_view.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_info_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/cli/vault_markets_view.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/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
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/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.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/rewards_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/core/withdraw_manager.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/lane.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/quote.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/ccip/transport.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/contracts.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/discovery.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/__init__.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/base.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/ccip.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/fuses/stargate.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/messages.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/simulation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/crosschain/stargate/lane.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/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.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/external_state.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/external_state_events.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/fuses/fluid_instadapp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/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.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/compound_v3.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/hypercore_outcome.py
RENAMED
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/lending_health.py
RENAMED
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/oracle_mapping.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/position_manager.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ipor_fusion-4.0.0.dev116 → ipor_fusion-4.0.0.dev118}/src/ipor_fusion/readers/unpriceable.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
|