ipor-fusion 4.0.0.dev291__tar.gz → 4.0.0.dev295__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.
Files changed (350) hide show
  1. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/AGENTS.md +11 -1
  2. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/MIGRATION_4.md +6 -2
  3. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/PKG-INFO +7 -3
  4. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/README.md +6 -2
  5. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/pyproject.toml +1 -1
  6. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/__init__.py +2 -0
  7. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/about.py +2 -1
  8. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/__init__.py +2 -0
  9. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/external_state_executor.py +46 -3
  10. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/models.py +3 -2
  11. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_external_state_executor.py +30 -1
  12. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_public_api.py +2 -0
  13. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.claude-plugin/marketplace.json +0 -0
  14. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.claude-plugin/plugin.json +0 -0
  15. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.env.example +0 -0
  16. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.gemini/settings.json +0 -0
  17. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.git-blame-ignore-revs +0 -0
  18. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/cd.yml +0 -0
  19. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/ci.yml +0 -0
  20. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/commit-lint.yml +0 -0
  21. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/notify-slack.yml +0 -0
  22. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/python-build.yml +0 -0
  23. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/python-publish.yml +0 -0
  24. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/release.yml +0 -0
  25. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.github/workflows/report-slack.yml +0 -0
  26. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.gitignore +0 -0
  27. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.mcp.json +0 -0
  28. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.pre-commit-config.yaml +0 -0
  29. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/.python-version +0 -0
  30. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/CHANGELOG.md +0 -0
  31. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/CLAUDE.md +0 -0
  32. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/CODEOWNERS +0 -0
  33. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/LICENSE +0 -0
  34. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/build.sh +0 -0
  35. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/CONTRIBUTING.md +0 -0
  36. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/README.md +0 -0
  37. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  38. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  39. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  40. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  41. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/external_state_margin_leg_base.py +0 -0
  42. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/examples/simple_aave_v3_supply_base.py +0 -0
  43. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/pytest.ini +0 -0
  44. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/scripts/commit-check.sh +0 -0
  45. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/scripts/crosschain_readiness.py +0 -0
  46. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/skills/ipor-deploy-vault/SKILL.md +0 -0
  47. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cache.py +0 -0
  48. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/chains.py +0 -0
  49. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/__init__.py +0 -0
  50. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/address_cmd.py +0 -0
  51. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  52. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/config_cmd.py +0 -0
  53. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/config_store.py +0 -0
  54. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/main.py +0 -0
  55. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/market_cmd.py +0 -0
  56. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/options.py +0 -0
  57. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  58. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  59. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_health.py +0 -0
  60. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  61. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  62. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  63. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/config/__init__.py +0 -0
  64. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/config/roles.py +0 -0
  65. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/access.py +0 -0
  66. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/address.py +0 -0
  67. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/context.py +0 -0
  68. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/context_manager.py +0 -0
  69. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/contract.py +0 -0
  70. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/erc20.py +0 -0
  71. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fee_manager.py +0 -0
  72. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fuse.py +0 -0
  73. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fuse_action.py +0 -0
  74. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fusion_factory.py +0 -0
  75. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/logs.py +0 -0
  76. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/multicall.py +0 -0
  77. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/oracle.py +0 -0
  78. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/plasma_vault.py +0 -0
  79. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/rewards_manager.py +0 -0
  80. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/simulation.py +0 -0
  81. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/simulation_result.py +0 -0
  82. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  83. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/__init__.py +0 -0
  84. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  85. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  86. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  87. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  88. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  89. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  90. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  91. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  92. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  93. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/contracts.py +0 -0
  94. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/discovery.py +0 -0
  95. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/errors.py +0 -0
  96. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  97. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  98. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  99. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  100. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/lane.py +0 -0
  101. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/logs.py +0 -0
  102. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/messages.py +0 -0
  103. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/simulation.py +0 -0
  104. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  105. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  106. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  107. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  108. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  109. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/transport.py +0 -0
  110. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/dependency_graph.py +0 -0
  111. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/entry_cli.py +0 -0
  112. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/entry_mcp.py +0 -0
  113. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/errors.py +0 -0
  114. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/explorer.py +0 -0
  115. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/field_docs.py +0 -0
  116. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/__init__.py +0 -0
  117. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  118. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/async_action.py +0 -0
  119. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/base.py +0 -0
  120. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  121. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/erc4626.py +0 -0
  122. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  123. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/events.py +0 -0
  124. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/external_state.py +0 -0
  125. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  126. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  127. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  128. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/hypercore.py +0 -0
  129. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  130. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/merkl.py +0 -0
  131. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/morpho.py +0 -0
  132. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  133. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  134. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/universal.py +0 -0
  135. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/__init__.py +0 -0
  136. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/architecture.md +0 -0
  137. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/glossary.md +0 -0
  138. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/invariants.md +0 -0
  139. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/quickstart.md +0 -0
  140. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/hypercore/__init__.py +0 -0
  141. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/market_ids.py +0 -0
  142. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/market_info.py +0 -0
  143. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/__init__.py +0 -0
  144. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/guide.py +0 -0
  145. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/server.py +0 -0
  146. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/morpho_api.py +0 -0
  147. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/py.typed +0 -0
  148. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/__init__.py +0 -0
  149. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/aave_v3.py +0 -0
  150. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/aave_v4.py +0 -0
  151. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/compound_v3.py +0 -0
  152. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/hypercore.py +0 -0
  153. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  154. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/lending_health.py +0 -0
  155. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/morpho.py +0 -0
  156. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  157. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  158. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  159. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/position_manager.py +0 -0
  160. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  161. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  162. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/unpriceable.py +0 -0
  163. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/registry.py +0 -0
  164. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/substrates.py +0 -0
  165. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/types.py +0 -0
  166. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/validation.py +0 -0
  167. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_data.py +0 -0
  168. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_erc20.py +0 -0
  169. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_info.py +0 -0
  170. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_managers.py +0 -0
  171. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_positions.py +0 -0
  172. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_reads.py +0 -0
  173. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/UniswapV3UniversalRouter.py +0 -0
  174. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_crosschain.py +0 -0
  175. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_crosschain_lifecycle.py +0 -0
  176. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_crosschain_recovery.py +0 -0
  177. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_euler_v2.py +0 -0
  178. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_event_args.py +0 -0
  179. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_fake_rpc.py +0 -0
  180. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_foundry.py +0 -0
  181. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_golden.py +0 -0
  182. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_guide.py +0 -0
  183. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_hypercore_model.py +0 -0
  184. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_hypercore_shadow.py +0 -0
  185. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_live.py +0 -0
  186. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_multicall.py +0 -0
  187. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_oracle_mapping_fake.py +0 -0
  188. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_simulate.py +0 -0
  189. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/_validation.py +0 -0
  190. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/addresses.py +0 -0
  191. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/conftest.py +0 -0
  192. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/constants.py +0 -0
  193. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  194. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_market55.json +0 -0
  195. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_official.json +0 -0
  196. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  197. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  198. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  199. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  200. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  201. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  202. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  203. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  204. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  205. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  206. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  207. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  208. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  209. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  210. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  211. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  212. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/simulate_v1_request.json +0 -0
  213. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.json +0 -0
  214. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  215. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  216. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  217. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  218. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  219. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  220. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  221. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  222. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.json +0 -0
  223. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  224. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.txt +0 -0
  225. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.json +0 -0
  226. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  227. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  228. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_about.py +0 -0
  229. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_access_manager.py +0 -0
  230. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cache.py +0 -0
  231. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_chains.py +0 -0
  232. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_address.py +0 -0
  233. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_changelog.py +0 -0
  234. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_commands.py +0 -0
  235. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_config_store.py +0 -0
  236. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_helpers.py +0 -0
  237. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_hypercore.py +0 -0
  238. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_lending_health.py +0 -0
  239. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_market_golden.py +0 -0
  240. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_market_morpho_blue.py +0 -0
  241. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_mcp_parity.py +0 -0
  242. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_oracle_mapping.py +0 -0
  243. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_oracle_mapping_golden.py +0 -0
  244. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_pending_requests_scan.py +0 -0
  245. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_role_accounts.py +0 -0
  246. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_info_golden.py +0 -0
  247. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_predates_getters.py +0 -0
  248. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_validate.py +0 -0
  249. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_contract_call.py +0 -0
  250. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_contract_encoder.py +0 -0
  251. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_events.py +0 -0
  252. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_indexer.py +0 -0
  253. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_quote.py +0 -0
  254. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_chainlink.py +0 -0
  255. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_contracts.py +0 -0
  256. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_encoding.py +0 -0
  257. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_errors.py +0 -0
  258. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_lane.py +0 -0
  259. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_layering.py +0 -0
  260. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_readiness.py +0 -0
  261. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_readiness_report.py +0 -0
  262. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_transport.py +0 -0
  263. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_docs_typing.py +0 -0
  264. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_erc20.py +0 -0
  265. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_error_hierarchy.py +0 -0
  266. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_examples_composed_hypercore.py +0 -0
  267. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_examples_crosschain.py +0 -0
  268. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  269. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_examples_vaults.py +0 -0
  270. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_explorer.py +0 -0
  271. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_external_state_events.py +0 -0
  272. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_fee_manager.py +0 -0
  273. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_fuse_encoding.py +0 -0
  274. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_fusion_instance.py +0 -0
  275. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_governance_wrappers.py +0 -0
  276. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_guide.py +0 -0
  277. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_deployment.py +0 -0
  278. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_events.py +0 -0
  279. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_flow.py +0 -0
  280. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_live.py +0 -0
  281. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_outcome.py +0 -0
  282. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_readers.py +0 -0
  283. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_simulation.py +0 -0
  284. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_logs.py +0 -0
  285. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_address.py +0 -0
  286. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_hypercore.py +0 -0
  287. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_models.py +0 -0
  288. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_server.py +0 -0
  289. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_vault_validate.py +0 -0
  290. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_multicall.py +0 -0
  291. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_oracle.py +0 -0
  292. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_oracle_mapping.py +0 -0
  293. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_plasma_vault.py +0 -0
  294. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_public_type_reachability.py +0 -0
  295. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_reader_encoding.py +0 -0
  296. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_readiness_selection.py +0 -0
  297. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_registry.py +0 -0
  298. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_revert_decoding.py +0 -0
  299. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_rewards_manager.py +0 -0
  300. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_roles.py +0 -0
  301. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_sdk_layering.py +0 -0
  302. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  303. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  304. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  305. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_canary.py +0 -0
  306. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_hypercore.py +0 -0
  307. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  308. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  309. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  310. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  311. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  312. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  313. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  314. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_arbitrum.py +0 -0
  315. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_base.py +0 -0
  316. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_crosschain.py +0 -0
  317. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_external_state_executor_base.py +0 -0
  318. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  319. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  320. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  321. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_morpho_blue.py +0 -0
  322. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v3.py +0 -0
  323. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  324. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  325. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  326. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  327. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_readers_integration.py +0 -0
  328. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_release_funds.py +0 -0
  329. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_swap_on_base.py +0 -0
  330. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  331. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulation_errors.py +0 -0
  332. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_simulation_observation.py +0 -0
  333. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_solidity_compiler.py +0 -0
  334. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_solidity_mirrors.py +0 -0
  335. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_substrates.py +0 -0
  336. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_types_and_events.py +0 -0
  337. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_unpriceable_tokens.py +0 -0
  338. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_validation.py +0 -0
  339. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_data_block.py +0 -0
  340. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_dep_graph.py +0 -0
  341. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_fetched_golden.py +0 -0
  342. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_onchain_base.py +0 -0
  343. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  344. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  345. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_vault_simulator_blocks.py +0 -0
  346. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_web3_context.py +0 -0
  347. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/test_withdraw_manager.py +0 -0
  348. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/typed_client/consumer.py +0 -0
  349. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/tests/typed_client/rejected.py +0 -0
  350. {ipor_fusion-4.0.0.dev291 → ipor_fusion-4.0.0.dev295}/uv.lock +0 -0
@@ -154,6 +154,15 @@ the lifecycle matrix follows that.
154
154
  `commit-lint.yml` fails a PR whose commit subjects or title break it. Never
155
155
  hand-bump `project.version`; the release workflow stamps it and re-locks
156
156
  `uv.lock`.
157
+ - Preview features (`ipor_fusion.crosschain` with its subpackages, and
158
+ `ipor_fusion.hypercore`) keep no backward compatibility: they follow the
159
+ current official contracts only, and support for retired deployments (the
160
+ pilot executors and factories, canaries) is removed rather than kept beside
161
+ them. From 4.1 on, a breaking change confined to them ships as `feat`/`fix`
162
+ without `!` or a `BREAKING CHANGE:` footer, so it never forces a major
163
+ release; anything it changes outside those packages (the top level, the
164
+ `vault info` document, the CLI and MCP) is still breaking by the usual rules.
165
+ 4.0 itself keeps its MIGRATION_4.md entries for them, for 3.x users.
157
166
  - This repository is public, and commit messages also ship in `CHANGELOG.md`
158
167
  inside the wheel. No issue-tracker keys (`IL-` plus a number), internal hosts,
159
168
  dashboard links or private repository names in commits, branch names, PR
@@ -207,7 +216,8 @@ the lifecycle matrix follows that.
207
216
  path. Adding or removing a
208
217
  name updates the snapshots in `tests/test_public_api.py` (every `__all__`, and
209
218
  the names each public module keeps by path); moving a name out of a public
210
- module leaves a re-export there. A removal or rename is a breaking change.
219
+ module leaves a re-export there. A removal or rename is a breaking change,
220
+ except inside a preview package (see Conventions).
211
221
  A project type used in a public signature or field is exported too
212
222
  (`tests/test_public_type_reachability.py`). The package is `py.typed`, so public APIs stay fully
213
223
  annotated.
@@ -438,8 +438,12 @@ exist; the comparison is equality either way.
438
438
  - `ExternalStateVaultState.last_checked_custodian_timestamp` is
439
439
  `last_checked_custodian_marker` and `BalanceFuseSnapshot.last_custodian_update_timestamp`
440
440
  is `custodian_marker`, both a `CustodianMarker` (an opaque value the
441
- contracts only compare for equality): a timestamp on an earlier executor, the
442
- confirm count on a released one. `ExternalStateExecutor.confirm_count()`
441
+ contracts only compare for equality): a unix timestamp on an earlier
442
+ executor, a confirmation count on a released one.
443
+ `ExternalStateVaultState.custodian_marker_kind` (`CustodianMarkerKind`, read
444
+ from the executor at the snapshot block; `None` without an executor) and
445
+ `ExternalStateExecutor.read_custodian_marker_kind(ctx)` say which; never
446
+ compare a count with a clock. `ExternalStateExecutor.confirm_count()`
443
447
  exists only on the released executor (it reverts on an earlier one), and
444
448
  `last_custodian_update_timestamp()` reads the timestamp on both.
445
449
  - New on the released build: `ExternalStateExecutor.unforwarded_credit(asset)`,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev291
3
+ Version: 4.0.0.dev295
4
4
  Summary: The IPOR Fusion SDK for Python
5
5
  Project-URL: homepage, https://ipor.io
6
6
  Project-URL: repository, https://github.com/IPOR-Labs/ipor-fusion.py
@@ -418,7 +418,8 @@ release; adding one does not.
418
418
  - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
419
419
  from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
420
420
  `crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
421
- from the top level, and may change in a minor release. Their exception classes
421
+ from the top level, and keep no backward compatibility: a minor release may
422
+ change or remove them (see [Preview features](#preview-features-ipor_fusioncrosschain-ipor_fusionhypercore)). Their exception classes
422
423
  stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
423
424
  (`HyperCoreJson`, ...) stay with the document.
424
425
  - **Third-party types** are not re-exported: import `ChecksumAddress` and
@@ -488,7 +489,10 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
488
489
  ### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
489
490
 
490
491
  Not production (see the note at the top) and outside the stable top level:
491
- import these from their subpackage, and expect changes in a minor release.
492
+ import these from their subpackage. They track the current official contracts
493
+ only, with no backward compatibility: from 4.1 on, a minor release may change or
494
+ remove any of these names and drops support for retired deployments (such as
495
+ the pilot executors and factories). Pin an exact version if you depend on them.
492
496
 
493
497
  | Name | Purpose |
494
498
  |------|---------|
@@ -369,7 +369,8 @@ release; adding one does not.
369
369
  - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
370
370
  from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
371
371
  `crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
372
- from the top level, and may change in a minor release. Their exception classes
372
+ from the top level, and keep no backward compatibility: a minor release may
373
+ change or remove them (see [Preview features](#preview-features-ipor_fusioncrosschain-ipor_fusionhypercore)). Their exception classes
373
374
  stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
374
375
  (`HyperCoreJson`, ...) stay with the document.
375
376
  - **Third-party types** are not re-exported: import `ChecksumAddress` and
@@ -439,7 +440,10 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
439
440
  ### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
440
441
 
441
442
  Not production (see the note at the top) and outside the stable top level:
442
- import these from their subpackage, and expect changes in a minor release.
443
+ import these from their subpackage. They track the current official contracts
444
+ only, with no backward compatibility: from 4.1 on, a minor release may change or
445
+ remove any of these names and drops support for retired deployments (such as
446
+ the pilot executors and factories). Pin an exact version if you depend on them.
443
447
 
444
448
  | Name | Purpose |
445
449
  |------|---------|
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev291"
3
+ version = "4.0.0.dev295"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -42,6 +42,7 @@ from ipor_fusion.core.erc20 import ERC20
42
42
  from ipor_fusion.core.external_state_executor import (
43
43
  BalanceFuseSnapshot,
44
44
  BalanceProposal,
45
+ CustodianMarkerKind,
45
46
  ExternalStateExecutor,
46
47
  ExternalStateVaultState,
47
48
  read_external_state,
@@ -545,6 +546,7 @@ __all__ = [
545
546
  "CloneArgs",
546
547
  "ExternalStateExecutor",
547
548
  "BalanceFuseSnapshot",
549
+ "CustodianMarkerKind",
548
550
  "ExternalStateVaultState",
549
551
  "read_external_state",
550
552
  "erc20_balance_slot",
@@ -41,7 +41,8 @@ PREVIEW_FEATURES: tuple[PreviewFeature, ...] = (
41
41
  PREVIEW_STATEMENT = (
42
42
  "Preview, not production: the contracts are under active development, the "
43
43
  "mainnet deployments are a proof of concept and IPOR Labs canaries, and "
44
- "interfaces may change between minor versions."
44
+ "interfaces may change or be removed between minor versions, with no "
45
+ "backward compatibility."
45
46
  )
46
47
 
47
48
  _DISTRIBUTION = "ipor-fusion"
@@ -18,6 +18,7 @@ from ipor_fusion.core.erc20 import ERC20
18
18
  from ipor_fusion.core.external_state_executor import (
19
19
  BalanceFuseSnapshot,
20
20
  BalanceProposal,
21
+ CustodianMarkerKind,
21
22
  ExternalStateExecutor,
22
23
  ExternalStateVaultState,
23
24
  read_external_state,
@@ -122,6 +123,7 @@ __all__ = [
122
123
  "BalanceFuseSnapshot",
123
124
  "BalanceProposal",
124
125
  "ExternalStateExecutor",
126
+ "CustodianMarkerKind",
125
127
  "ExternalStateVaultState",
126
128
  "read_external_state",
127
129
  "Fuse",
@@ -18,13 +18,15 @@ from __future__ import annotations
18
18
 
19
19
  from collections.abc import Iterable
20
20
  from dataclasses import dataclass, replace
21
+ from enum import Enum
21
22
 
22
23
  from eth_abi import decode, encode
23
24
  from eth_abi.exceptions import DecodingError
24
25
  from eth_typing import ChecksumAddress
25
- from eth_utils import keccak
26
+ from eth_utils import function_signature_to_4byte_selector, keccak
26
27
  from hexbytes import HexBytes
27
28
  from web3 import Web3
29
+ from web3.exceptions import ContractLogicError
28
30
  from web3.types import BlockIdentifier, Timestamp
29
31
 
30
32
  from ipor_fusion.core.context import Web3Context
@@ -118,6 +120,35 @@ def _require_matching_hash(
118
120
  )
119
121
 
120
122
 
123
+ class CustodianMarkerKind(Enum):
124
+ """What an executor's custodian marker counts: the last confirmed update's
125
+ unix timestamp (executors before the 2026-10-21 contracts release) or the
126
+ number of confirmed updates (executors of that release)."""
127
+
128
+ TIMESTAMP = "timestamp"
129
+ CONFIRM_COUNT = "confirm_count"
130
+
131
+
132
+ _CONFIRM_COUNT_SELECTOR = function_signature_to_4byte_selector("confirmCount()")
133
+
134
+
135
+ def _read_marker_kind(
136
+ ctx: Web3Context, executor: ChecksumAddress, block: BlockIdentifier
137
+ ) -> CustodianMarkerKind:
138
+ """Decided from the executor, not guessed from a value: a released
139
+ executor answers ``confirmCount()``, an earlier one has no such function
140
+ and the call reverts. Any other failure raises."""
141
+ try:
142
+ raw = ctx.call(executor, _CONFIRM_COUNT_SELECTOR, block)
143
+ except ContractLogicError:
144
+ return CustodianMarkerKind.TIMESTAMP
145
+ if len(raw) != 32:
146
+ raise ExternalStateError(
147
+ f"confirmCount() of {executor} returned {len(raw)} bytes, not a uint256"
148
+ )
149
+ return CustodianMarkerKind.CONFIRM_COUNT
150
+
151
+
121
152
  @dataclass(frozen=True, slots=True)
122
153
  class ExternalStateVaultState:
123
154
  """The external-state market's vault-scoped state, read from the vault's
@@ -136,7 +167,9 @@ class ExternalStateVaultState:
136
167
  and not the pre-hook's staleness clock, which is
137
168
  `ExternalStateExecutor.get_oldest_update_timestamp`. The fuse and the
138
169
  pre-hook only compare it for equality with
139
- `BalanceFuseSnapshot.custodian_marker`; `paused` is the flag
170
+ `BalanceFuseSnapshot.custodian_marker`. `custodian_marker_kind` says
171
+ which, read from the executor at the same block (``None`` without an
172
+ executor); `paused` is the flag
140
173
  the balance fuse sets on a big change and `ExternalStateUnpauseFuse` clears
141
174
  with an atomist signature. `ExternalStatePausePreHook` blocks the vault's
142
175
  gated user operations while the flag is set, and also, flag or not, while
@@ -148,6 +181,7 @@ class ExternalStateVaultState:
148
181
  executor: ChecksumAddress | None
149
182
  last_total_balance: Amount
150
183
  last_checked_custodian_marker: CustodianMarker
184
+ custodian_marker_kind: CustodianMarkerKind | None
151
185
  paused: bool
152
186
  block: int
153
187
 
@@ -232,10 +266,14 @@ def read_external_state(
232
266
  raise ExternalStateError(
233
267
  f"malformed pause flag in the external-state storage of {checksum}"
234
268
  )
269
+ executor = Web3.to_checksum_address(f"0x{words[0]:040x}") if words[0] else None
235
270
  return ExternalStateVaultState(
236
- executor=Web3.to_checksum_address(f"0x{words[0]:040x}") if words[0] else None,
271
+ executor=executor,
237
272
  last_total_balance=Amount(words[1]),
238
273
  last_checked_custodian_marker=CustodianMarker(words[2]),
274
+ custodian_marker_kind=(
275
+ _read_marker_kind(ctx, executor, read_at) if executor else None
276
+ ),
239
277
  paused=words[3] == 1,
240
278
  block=block,
241
279
  )
@@ -365,6 +403,11 @@ class ExternalStateExecutor(ContractWrapper):
365
403
  )
366
404
  )
367
405
 
406
+ def read_custodian_marker_kind(self, ctx: Web3Context) -> CustodianMarkerKind:
407
+ """Whether this executor's custodian marker is a timestamp or a
408
+ confirm count, at ``ctx``'s default block (see `CustodianMarkerKind`)."""
409
+ return _read_marker_kind(ctx, self._require_address(), ctx.default_block)
410
+
368
411
  def confirm_count(self) -> Call[CustodianMarker]:
369
412
  """Executors of the 2026-10-21 contracts release only: the count of
370
413
  confirmed custodian updates across every balance account, the marker
@@ -1176,8 +1176,9 @@ class PreviewFeatureModel(_Base):
1176
1176
  default="preview",
1177
1177
  description="Always 'preview': not production. The contracts are under "
1178
1178
  "active development, the mainnet deployments are a proof of concept "
1179
- "and IPOR Labs canaries, and interfaces may change between minor "
1180
- "versions. Route no production capital through these features.",
1179
+ "and IPOR Labs canaries, and interfaces may change or be removed "
1180
+ "between minor versions, with no backward compatibility. Route no "
1181
+ "production capital through these features.",
1181
1182
  )
1182
1183
 
1183
1184
 
@@ -13,6 +13,7 @@ from eth_typing import ChecksumAddress
13
13
  from eth_utils import keccak
14
14
  from hexbytes import HexBytes
15
15
  from web3 import Web3
16
+ from web3.exceptions import ContractLogicError
16
17
  from web3.types import Timestamp
17
18
 
18
19
  from ipor_fusion.core.external_state_executor import (
@@ -1182,8 +1183,12 @@ class TestReadExternalState:
1182
1183
  BLOCKS = {"safe": 4_804_990, "finalized": 4_804_900, "earliest": 0}
1183
1184
  HASH = "0x" + "ab" * 32
1184
1185
 
1185
- def _ctx(self, words, default_block="latest", head=4_805_000):
1186
+ def _ctx(self, words, default_block="latest", head=4_805_000, confirm_count=None):
1186
1187
  ctx = MagicMock()
1188
+ if confirm_count is None:
1189
+ ctx.call.side_effect = ContractLogicError("execution reverted")
1190
+ else:
1191
+ ctx.call.return_value = HexBytes(confirm_count.to_bytes(32, "big"))
1187
1192
  ctx.default_block = default_block
1188
1193
  blocks = dict(self.BLOCKS, latest=head)
1189
1194
  blocks[self.HASH] = 4_700_123
@@ -1194,6 +1199,30 @@ class TestReadExternalState:
1194
1199
  ctx.get_storage_at.side_effect = lambda vault, slot, block=None: by_slot[slot]
1195
1200
  return ctx
1196
1201
 
1202
+ def test_the_marker_kind_is_read_from_the_executor_at_the_same_block(self):
1203
+ from ipor_fusion import CustodianMarkerKind, read_external_state
1204
+
1205
+ earlier = read_external_state(
1206
+ self._ctx([int(EXECUTOR_ADDR, 16), 1, 1_791_458_983, 0]), VAULT_ADDR
1207
+ )
1208
+ assert earlier.custodian_marker_kind is CustodianMarkerKind.TIMESTAMP
1209
+ ctx = self._ctx([int(EXECUTOR_ADDR, 16), 1, 7, 0], confirm_count=7)
1210
+ released = read_external_state(ctx, VAULT_ADDR)
1211
+ assert released.custodian_marker_kind is CustodianMarkerKind.CONFIRM_COUNT
1212
+ to, data, block = ctx.call.call_args.args
1213
+ assert data == Web3.keccak(text="confirmCount()")[:4]
1214
+ assert block == 4_805_000
1215
+ none = read_external_state(self._ctx([0, 0, 0, 0]), VAULT_ADDR)
1216
+ assert none.custodian_marker_kind is None
1217
+
1218
+ def test_a_failed_kind_read_raises(self):
1219
+ from ipor_fusion import read_external_state
1220
+
1221
+ ctx = self._ctx([int(EXECUTOR_ADDR, 16), 1, 7, 0])
1222
+ ctx.call.side_effect = ConnectionError("rpc down")
1223
+ with pytest.raises(ConnectionError):
1224
+ read_external_state(ctx, VAULT_ADDR)
1225
+
1197
1226
  def test_reads_the_four_slots_at_one_resolved_block(self):
1198
1227
  from ipor_fusion import read_external_state
1199
1228
 
@@ -153,6 +153,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
153
153
  "ExternalStateTotalBalanceUpdatedArgs",
154
154
  "ExternalStateUnpausedArgs",
155
155
  "ExternalStateUnpausedEvent",
156
+ "CustodianMarkerKind",
156
157
  "ExternalStateVaultState",
157
158
  "Fee",
158
159
  "FeeAccount",
@@ -531,6 +532,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
531
532
  "CloneArgs",
532
533
  "ERC20",
533
534
  "ExternalStateExecutor",
535
+ "CustodianMarkerKind",
534
536
  "ExternalStateVaultState",
535
537
  "FeeAccount",
536
538
  "FeeManager",