ipor-fusion 4.0.0.dev293__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.dev293 → ipor_fusion-4.0.0.dev295}/MIGRATION_4.md +6 -2
  2. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/PKG-INFO +1 -1
  3. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/pyproject.toml +1 -1
  4. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/__init__.py +2 -0
  5. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/__init__.py +2 -0
  6. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/external_state_executor.py +46 -3
  7. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_external_state_executor.py +30 -1
  8. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_public_api.py +2 -0
  9. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.claude-plugin/marketplace.json +0 -0
  10. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.claude-plugin/plugin.json +0 -0
  11. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.env.example +0 -0
  12. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.gemini/settings.json +0 -0
  13. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.git-blame-ignore-revs +0 -0
  14. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/cd.yml +0 -0
  15. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/ci.yml +0 -0
  16. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/commit-lint.yml +0 -0
  17. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/notify-slack.yml +0 -0
  18. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/python-build.yml +0 -0
  19. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/python-publish.yml +0 -0
  20. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/release.yml +0 -0
  21. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.github/workflows/report-slack.yml +0 -0
  22. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.gitignore +0 -0
  23. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.mcp.json +0 -0
  24. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.pre-commit-config.yaml +0 -0
  25. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/.python-version +0 -0
  26. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/AGENTS.md +0 -0
  27. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/CHANGELOG.md +0 -0
  28. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/CLAUDE.md +0 -0
  29. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/CODEOWNERS +0 -0
  30. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/LICENSE +0 -0
  31. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/README.md +0 -0
  32. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/build.sh +0 -0
  33. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/CONTRIBUTING.md +0 -0
  34. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/README.md +0 -0
  35. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  36. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  37. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  38. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  39. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/external_state_margin_leg_base.py +0 -0
  40. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/examples/simple_aave_v3_supply_base.py +0 -0
  41. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/pytest.ini +0 -0
  42. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/scripts/commit-check.sh +0 -0
  43. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/scripts/crosschain_readiness.py +0 -0
  44. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/skills/ipor-deploy-vault/SKILL.md +0 -0
  45. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/about.py +0 -0
  46. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cache.py +0 -0
  47. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/chains.py +0 -0
  48. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/__init__.py +0 -0
  49. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/address_cmd.py +0 -0
  50. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  51. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/config_cmd.py +0 -0
  52. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/config_store.py +0 -0
  53. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/main.py +0 -0
  54. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/market_cmd.py +0 -0
  55. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/options.py +0 -0
  56. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  57. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  58. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_health.py +0 -0
  59. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  60. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  61. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  62. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/config/__init__.py +0 -0
  63. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/config/roles.py +0 -0
  64. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/access.py +0 -0
  65. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/address.py +0 -0
  66. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/context.py +0 -0
  67. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/context_manager.py +0 -0
  68. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/contract.py +0 -0
  69. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/erc20.py +0 -0
  70. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fee_manager.py +0 -0
  71. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fuse.py +0 -0
  72. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fuse_action.py +0 -0
  73. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/fusion_factory.py +0 -0
  74. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/logs.py +0 -0
  75. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/multicall.py +0 -0
  76. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/oracle.py +0 -0
  77. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/plasma_vault.py +0 -0
  78. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/rewards_manager.py +0 -0
  79. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/simulation.py +0 -0
  80. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/simulation_result.py +0 -0
  81. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  82. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/__init__.py +0 -0
  83. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  84. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  85. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  86. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  87. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  88. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  89. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  90. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  91. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  92. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/contracts.py +0 -0
  93. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/discovery.py +0 -0
  94. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/errors.py +0 -0
  95. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  96. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  97. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  98. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  99. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/lane.py +0 -0
  100. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/logs.py +0 -0
  101. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/messages.py +0 -0
  102. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/simulation.py +0 -0
  103. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  104. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  105. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  106. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  107. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  108. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/crosschain/transport.py +0 -0
  109. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/dependency_graph.py +0 -0
  110. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/entry_cli.py +0 -0
  111. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/entry_mcp.py +0 -0
  112. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/errors.py +0 -0
  113. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/explorer.py +0 -0
  114. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/field_docs.py +0 -0
  115. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/__init__.py +0 -0
  116. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  117. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/async_action.py +0 -0
  118. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/base.py +0 -0
  119. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  120. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/erc4626.py +0 -0
  121. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  122. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/events.py +0 -0
  123. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/external_state.py +0 -0
  124. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  125. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  126. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  127. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/hypercore.py +0 -0
  128. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  129. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/merkl.py +0 -0
  130. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/morpho.py +0 -0
  131. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  132. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  133. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/fuses/universal.py +0 -0
  134. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/__init__.py +0 -0
  135. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/architecture.md +0 -0
  136. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/glossary.md +0 -0
  137. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/invariants.md +0 -0
  138. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/guide/quickstart.md +0 -0
  139. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/hypercore/__init__.py +0 -0
  140. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/market_ids.py +0 -0
  141. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/market_info.py +0 -0
  142. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/__init__.py +0 -0
  143. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/guide.py +0 -0
  144. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/models.py +0 -0
  145. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/mcp/server.py +0 -0
  146. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/morpho_api.py +0 -0
  147. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/py.typed +0 -0
  148. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/__init__.py +0 -0
  149. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/aave_v3.py +0 -0
  150. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/aave_v4.py +0 -0
  151. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/compound_v3.py +0 -0
  152. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/hypercore.py +0 -0
  153. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  154. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/lending_health.py +0 -0
  155. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/morpho.py +0 -0
  156. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  157. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  158. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  159. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/position_manager.py +0 -0
  160. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  161. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  162. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/readers/unpriceable.py +0 -0
  163. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/registry.py +0 -0
  164. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/substrates.py +0 -0
  165. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/types.py +0 -0
  166. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/validation.py +0 -0
  167. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_data.py +0 -0
  168. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_erc20.py +0 -0
  169. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_info.py +0 -0
  170. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_managers.py +0 -0
  171. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_positions.py +0 -0
  172. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/src/ipor_fusion/vault_reads.py +0 -0
  173. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/UniswapV3UniversalRouter.py +0 -0
  174. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_crosschain.py +0 -0
  175. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_crosschain_lifecycle.py +0 -0
  176. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_crosschain_recovery.py +0 -0
  177. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_euler_v2.py +0 -0
  178. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_event_args.py +0 -0
  179. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_fake_rpc.py +0 -0
  180. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_foundry.py +0 -0
  181. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_golden.py +0 -0
  182. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_guide.py +0 -0
  183. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_hypercore_model.py +0 -0
  184. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_hypercore_shadow.py +0 -0
  185. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_live.py +0 -0
  186. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_multicall.py +0 -0
  187. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_oracle_mapping_fake.py +0 -0
  188. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_simulate.py +0 -0
  189. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/_validation.py +0 -0
  190. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/addresses.py +0 -0
  191. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/conftest.py +0 -0
  192. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/constants.py +0 -0
  193. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  194. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_market55.json +0 -0
  195. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/hypercore_official.json +0 -0
  196. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  197. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  198. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  199. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  200. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  201. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  202. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  203. {ipor_fusion-4.0.0.dev293 → 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.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  205. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  206. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  207. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  208. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  209. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  210. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  211. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  212. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/simulate_v1_request.json +0 -0
  213. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.json +0 -0
  214. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  215. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  216. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  217. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  218. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  219. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  220. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  221. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  222. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.json +0 -0
  223. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  224. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/full.txt +0 -0
  225. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.json +0 -0
  226. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  227. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  228. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_about.py +0 -0
  229. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_access_manager.py +0 -0
  230. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cache.py +0 -0
  231. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_chains.py +0 -0
  232. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_address.py +0 -0
  233. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_changelog.py +0 -0
  234. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_commands.py +0 -0
  235. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_config_store.py +0 -0
  236. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_helpers.py +0 -0
  237. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_hypercore.py +0 -0
  238. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_lending_health.py +0 -0
  239. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_market_golden.py +0 -0
  240. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_market_morpho_blue.py +0 -0
  241. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_mcp_parity.py +0 -0
  242. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_oracle_mapping.py +0 -0
  243. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_oracle_mapping_golden.py +0 -0
  244. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_pending_requests_scan.py +0 -0
  245. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_role_accounts.py +0 -0
  246. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_info_golden.py +0 -0
  247. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_predates_getters.py +0 -0
  248. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_cli_vault_validate.py +0 -0
  249. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_contract_call.py +0 -0
  250. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_contract_encoder.py +0 -0
  251. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_events.py +0 -0
  252. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_indexer.py +0 -0
  253. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_ccip_quote.py +0 -0
  254. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_chainlink.py +0 -0
  255. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_contracts.py +0 -0
  256. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_encoding.py +0 -0
  257. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_errors.py +0 -0
  258. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_lane.py +0 -0
  259. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_layering.py +0 -0
  260. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_readiness.py +0 -0
  261. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_readiness_report.py +0 -0
  262. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_crosschain_transport.py +0 -0
  263. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_docs_typing.py +0 -0
  264. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_erc20.py +0 -0
  265. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_error_hierarchy.py +0 -0
  266. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_examples_composed_hypercore.py +0 -0
  267. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_examples_crosschain.py +0 -0
  268. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  269. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_examples_vaults.py +0 -0
  270. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_explorer.py +0 -0
  271. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_external_state_events.py +0 -0
  272. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_fee_manager.py +0 -0
  273. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_fuse_encoding.py +0 -0
  274. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_fusion_instance.py +0 -0
  275. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_governance_wrappers.py +0 -0
  276. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_guide.py +0 -0
  277. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_deployment.py +0 -0
  278. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_events.py +0 -0
  279. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_flow.py +0 -0
  280. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_live.py +0 -0
  281. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_outcome.py +0 -0
  282. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_readers.py +0 -0
  283. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_hypercore_simulation.py +0 -0
  284. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_logs.py +0 -0
  285. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_address.py +0 -0
  286. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_hypercore.py +0 -0
  287. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_models.py +0 -0
  288. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_server.py +0 -0
  289. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_mcp_vault_validate.py +0 -0
  290. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_multicall.py +0 -0
  291. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_oracle.py +0 -0
  292. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_oracle_mapping.py +0 -0
  293. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_plasma_vault.py +0 -0
  294. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_public_type_reachability.py +0 -0
  295. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_reader_encoding.py +0 -0
  296. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_readiness_selection.py +0 -0
  297. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_registry.py +0 -0
  298. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_revert_decoding.py +0 -0
  299. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_rewards_manager.py +0 -0
  300. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_roles.py +0 -0
  301. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_sdk_layering.py +0 -0
  302. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  303. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  304. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  305. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_canary.py +0 -0
  306. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_hypercore.py +0 -0
  307. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  308. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  309. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  310. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  311. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  312. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  313. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  314. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_arbitrum.py +0 -0
  315. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_base.py +0 -0
  316. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_examples_crosschain.py +0 -0
  317. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_external_state_executor_base.py +0 -0
  318. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  319. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  320. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  321. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_morpho_blue.py +0 -0
  322. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v3.py +0 -0
  323. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  324. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  325. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  326. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  327. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_readers_integration.py +0 -0
  328. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_release_funds.py +0 -0
  329. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_swap_on_base.py +0 -0
  330. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  331. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulation_errors.py +0 -0
  332. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_simulation_observation.py +0 -0
  333. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_solidity_compiler.py +0 -0
  334. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_solidity_mirrors.py +0 -0
  335. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_substrates.py +0 -0
  336. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_types_and_events.py +0 -0
  337. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_unpriceable_tokens.py +0 -0
  338. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_validation.py +0 -0
  339. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_data_block.py +0 -0
  340. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_dep_graph.py +0 -0
  341. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_fetched_golden.py +0 -0
  342. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_onchain_base.py +0 -0
  343. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  344. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  345. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_vault_simulator_blocks.py +0 -0
  346. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_web3_context.py +0 -0
  347. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/test_withdraw_manager.py +0 -0
  348. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/typed_client/consumer.py +0 -0
  349. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/tests/typed_client/rejected.py +0 -0
  350. {ipor_fusion-4.0.0.dev293 → ipor_fusion-4.0.0.dev295}/uv.lock +0 -0
@@ -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.dev293
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev293"
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",
@@ -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
@@ -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",