ipor-fusion 4.0.0.dev210__tar.gz → 4.0.0.dev215__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 (341) hide show
  1. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/AGENTS.md +8 -4
  2. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/MIGRATION_4.md +50 -10
  3. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/PKG-INFO +26 -15
  4. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/README.md +25 -14
  5. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +22 -20
  6. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +10 -8
  7. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/pyproject.toml +1 -1
  8. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/scripts/crosschain_readiness.py +7 -2
  9. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/__init__.py +1 -445
  10. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/__init__.py +26 -0
  11. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/__init__.py +0 -126
  12. ipor_fusion-4.0.0.dev215/src/ipor_fusion/hypercore/__init__.py +214 -0
  13. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/__init__.py +0 -60
  14. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/hypercore.py +1 -1
  15. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain.py +3 -3
  16. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain_lifecycle.py +7 -5
  17. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_crosschain_recovery.py +3 -7
  18. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_events.py +1 -1
  19. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_indexer.py +1 -1
  20. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_ccip_quote.py +2 -1
  21. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_chainlink.py +7 -3
  22. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_lane.py +13 -17
  23. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_readiness.py +2 -2
  24. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_transport.py +18 -16
  25. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_deployment.py +2 -1
  26. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_events.py +2 -2
  27. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_flow.py +3 -6
  28. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_live.py +13 -14
  29. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_outcome.py +2 -3
  30. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_readers.py +2 -3
  31. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_hypercore_simulation.py +3 -6
  32. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_models.py +1 -3
  33. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_public_api.py +228 -344
  34. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_public_type_reachability.py +1 -0
  35. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_canary.py +1 -1
  36. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_hypercore.py +9 -5
  37. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_hyperevm.py +10 -8
  38. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_crosschain.py +1 -1
  39. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/typed_client/consumer.py +25 -21
  40. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/typed_client/rejected.py +2 -3
  41. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.claude-plugin/marketplace.json +0 -0
  42. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.claude-plugin/plugin.json +0 -0
  43. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.env.example +0 -0
  44. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.gemini/settings.json +0 -0
  45. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.git-blame-ignore-revs +0 -0
  46. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/cd.yml +0 -0
  47. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/ci.yml +0 -0
  48. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/commit-lint.yml +0 -0
  49. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/notify-slack.yml +0 -0
  50. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/python-build.yml +0 -0
  51. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/python-publish.yml +0 -0
  52. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/release.yml +0 -0
  53. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.github/workflows/report-slack.yml +0 -0
  54. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.gitignore +0 -0
  55. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.mcp.json +0 -0
  56. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.pre-commit-config.yaml +0 -0
  57. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/.python-version +0 -0
  58. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CHANGELOG.md +0 -0
  59. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CLAUDE.md +0 -0
  60. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/CODEOWNERS +0 -0
  61. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/LICENSE +0 -0
  62. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/build.sh +0 -0
  63. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/CONTRIBUTING.md +0 -0
  64. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/README.md +0 -0
  65. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  66. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  67. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/external_state_margin_leg_base.py +0 -0
  68. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/examples/simple_aave_v3_supply_base.py +0 -0
  69. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/pytest.ini +0 -0
  70. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/scripts/commit-check.sh +0 -0
  71. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/skills/ipor-deploy-vault/SKILL.md +0 -0
  72. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/about.py +0 -0
  73. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cache.py +0 -0
  74. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/chains.py +0 -0
  75. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/__init__.py +0 -0
  76. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  77. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/config_cmd.py +0 -0
  78. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/config_store.py +0 -0
  79. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/main.py +0 -0
  80. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/market_cmd.py +0 -0
  81. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/options.py +0 -0
  82. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  83. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  84. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_health.py +0 -0
  85. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  86. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  87. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  88. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/config/__init__.py +0 -0
  89. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/config/roles.py +0 -0
  90. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/__init__.py +0 -0
  91. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/access.py +0 -0
  92. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/address.py +0 -0
  93. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/context.py +0 -0
  94. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/contract.py +0 -0
  95. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/erc20.py +0 -0
  96. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/external_state_executor.py +0 -0
  97. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fee_manager.py +0 -0
  98. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fuse.py +0 -0
  99. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fuse_action.py +0 -0
  100. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/fusion_factory.py +0 -0
  101. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/logs.py +0 -0
  102. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/multicall.py +0 -0
  103. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/oracle.py +0 -0
  104. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/plasma_vault.py +0 -0
  105. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/rewards_manager.py +0 -0
  106. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/simulation.py +0 -0
  107. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/simulation_result.py +0 -0
  108. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  109. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  110. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  111. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  112. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  113. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  114. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  115. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  116. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  117. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  118. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/contracts.py +0 -0
  119. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/discovery.py +0 -0
  120. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/errors.py +0 -0
  121. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  122. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  123. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  124. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  125. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/lane.py +0 -0
  126. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/logs.py +0 -0
  127. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/messages.py +0 -0
  128. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/simulation.py +0 -0
  129. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  130. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  131. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  132. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  133. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  134. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/crosschain/transport.py +0 -0
  135. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/dependency_graph.py +0 -0
  136. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/entry_cli.py +0 -0
  137. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/entry_mcp.py +0 -0
  138. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/errors.py +0 -0
  139. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/explorer.py +0 -0
  140. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/field_docs.py +0 -0
  141. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  142. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/async_action.py +0 -0
  143. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/base.py +0 -0
  144. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  145. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/erc4626.py +0 -0
  146. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  147. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/events.py +0 -0
  148. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/external_state.py +0 -0
  149. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  150. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  151. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  152. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/hypercore.py +0 -0
  153. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  154. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/merkl.py +0 -0
  155. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/morpho.py +0 -0
  156. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  157. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  158. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/fuses/universal.py +0 -0
  159. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/__init__.py +0 -0
  160. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/architecture.md +0 -0
  161. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/glossary.md +0 -0
  162. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/invariants.md +0 -0
  163. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/guide/quickstart.md +0 -0
  164. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/market_ids.py +0 -0
  165. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/market_info.py +0 -0
  166. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/__init__.py +0 -0
  167. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/guide.py +0 -0
  168. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/models.py +0 -0
  169. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/mcp/server.py +0 -0
  170. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/morpho_api.py +0 -0
  171. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/py.typed +0 -0
  172. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/aave_v3.py +0 -0
  173. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/aave_v4.py +0 -0
  174. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/compound_v3.py +0 -0
  175. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  176. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/lending_health.py +0 -0
  177. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/morpho.py +0 -0
  178. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  179. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  180. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  181. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/position_manager.py +0 -0
  182. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  183. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  184. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/readers/unpriceable.py +0 -0
  185. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/substrates.py +0 -0
  186. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/types.py +0 -0
  187. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/validation.py +0 -0
  188. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_data.py +0 -0
  189. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_erc20.py +0 -0
  190. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_info.py +0 -0
  191. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_managers.py +0 -0
  192. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_positions.py +0 -0
  193. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/src/ipor_fusion/vault_reads.py +0 -0
  194. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/UniswapV3UniversalRouter.py +0 -0
  195. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_euler_v2.py +0 -0
  196. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_event_args.py +0 -0
  197. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_fake_rpc.py +0 -0
  198. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_foundry.py +0 -0
  199. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_golden.py +0 -0
  200. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_guide.py +0 -0
  201. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_hypercore_model.py +0 -0
  202. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_hypercore_shadow.py +0 -0
  203. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_live.py +0 -0
  204. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_multicall.py +0 -0
  205. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_oracle_mapping_fake.py +0 -0
  206. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_simulate.py +0 -0
  207. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/_validation.py +0 -0
  208. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/addresses.py +0 -0
  209. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/conftest.py +0 -0
  210. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/constants.py +0 -0
  211. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  212. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/hypercore_market55.json +0 -0
  213. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  214. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  215. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  216. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  217. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  218. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  219. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  220. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  221. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  222. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  223. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  224. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  225. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  226. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  227. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  228. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  229. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/simulate_v1_request.json +0 -0
  230. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.json +0 -0
  231. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  232. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  233. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  234. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  235. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  236. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  237. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  238. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  239. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.json +0 -0
  240. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  241. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/full.txt +0 -0
  242. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.json +0 -0
  243. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  244. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  245. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_about.py +0 -0
  246. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_access_manager.py +0 -0
  247. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cache.py +0 -0
  248. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_chains.py +0 -0
  249. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_changelog.py +0 -0
  250. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_commands.py +0 -0
  251. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_config_store.py +0 -0
  252. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_helpers.py +0 -0
  253. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_hypercore.py +0 -0
  254. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_lending_health.py +0 -0
  255. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_market_golden.py +0 -0
  256. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_market_morpho_blue.py +0 -0
  257. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_oracle_mapping.py +0 -0
  258. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_oracle_mapping_golden.py +0 -0
  259. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_pending_requests_scan.py +0 -0
  260. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_role_accounts.py +0 -0
  261. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_info_golden.py +0 -0
  262. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_predates_getters.py +0 -0
  263. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_cli_vault_validate.py +0 -0
  264. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_contract_call.py +0 -0
  265. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_contract_encoder.py +0 -0
  266. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_contracts.py +0 -0
  267. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_encoding.py +0 -0
  268. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_errors.py +0 -0
  269. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_layering.py +0 -0
  270. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_crosschain_readiness_report.py +0 -0
  271. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_docs_typing.py +0 -0
  272. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_erc20.py +0 -0
  273. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_error_hierarchy.py +0 -0
  274. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_composed_hypercore.py +0 -0
  275. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_crosschain.py +0 -0
  276. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  277. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_examples_vaults.py +0 -0
  278. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_explorer.py +0 -0
  279. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_external_state_events.py +0 -0
  280. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_external_state_executor.py +0 -0
  281. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fee_manager.py +0 -0
  282. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fuse_encoding.py +0 -0
  283. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_fusion_instance.py +0 -0
  284. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_guide.py +0 -0
  285. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_logs.py +0 -0
  286. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_hypercore.py +0 -0
  287. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_server.py +0 -0
  288. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_mcp_vault_validate.py +0 -0
  289. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_multicall.py +0 -0
  290. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_oracle.py +0 -0
  291. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_oracle_mapping.py +0 -0
  292. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_plasma_vault.py +0 -0
  293. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_reader_encoding.py +0 -0
  294. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_readiness_selection.py +0 -0
  295. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_revert_decoding.py +0 -0
  296. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_rewards_manager.py +0 -0
  297. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_roles.py +0 -0
  298. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_sdk_layering.py +0 -0
  299. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  300. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  301. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  302. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  303. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  304. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  305. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  306. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  307. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  308. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_arbitrum.py +0 -0
  309. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_examples_base.py +0 -0
  310. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_external_state_executor_base.py +0 -0
  311. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  312. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  313. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  314. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_morpho_blue.py +0 -0
  315. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v3.py +0 -0
  316. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  317. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  318. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  319. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  320. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_readers_integration.py +0 -0
  321. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_release_funds.py +0 -0
  322. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_swap_on_base.py +0 -0
  323. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  324. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulation_errors.py +0 -0
  325. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_simulation_observation.py +0 -0
  326. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_solidity_compiler.py +0 -0
  327. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_solidity_mirrors.py +0 -0
  328. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_substrates.py +0 -0
  329. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_types_and_events.py +0 -0
  330. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_unpriceable_tokens.py +0 -0
  331. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_validation.py +0 -0
  332. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_data_block.py +0 -0
  333. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_dep_graph.py +0 -0
  334. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_fetched_golden.py +0 -0
  335. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_onchain_base.py +0 -0
  336. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  337. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  338. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_vault_simulator_blocks.py +0 -0
  339. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_web3_context.py +0 -0
  340. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/tests/test_withdraw_manager.py +0 -0
  341. {ipor_fusion-4.0.0.dev210 → ipor_fusion-4.0.0.dev215}/uv.lock +0 -0
@@ -186,10 +186,14 @@ the lifecycle matrix follows that.
186
186
  strings (`field_docs.py` ships as API documentation). Comments only for edge
187
187
  cases and non-obvious logic.
188
188
  - The public API is `ipor_fusion.__all__` (README, "Public API and stability").
189
- Every public symbol is imported and listed there; a symbol of a public
190
- subpackage (`core`, `config`, `fuses`, `readers`, `crosschain`,
191
- `crosschain.fuses`, `crosschain.ccip`, `crosschain.stargate`) also goes in that
192
- subpackage's `__all__`. `ipor_fusion.guide` keeps its own namespace. The
189
+ Every stable public symbol is imported and listed there; a symbol of a stable
190
+ subpackage (`core`, `config`, `fuses`, `readers`) also goes in that
191
+ subpackage's `__all__`. Preview features (`PREVIEW_FEATURES`) export only from
192
+ their own subpackages, never from the top level: crosschain from `crosschain`
193
+ (`crosschain.fuses`, `crosschain.ccip`, `crosschain.stargate`), HyperCore from
194
+ `hypercore` (which re-exports from `fuses/` and `readers/` modules; those
195
+ subpackages do not list them). Their exceptions stay in `errors` and the top
196
+ level. `ipor_fusion.guide` keeps its own namespace. The
193
197
  public modules (`about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`,
194
198
  `field_docs`, `market_ids`, `market_info`, `morpho_api`, `substrates`, `types`,
195
199
  `validation`, `vault_data`, `vault_info`) stay importable for the names they
@@ -23,12 +23,16 @@ the details, and each change is described once, in its section.
23
23
  Work through these in order; each is what breaks first at run time after the one
24
24
  before it is fixed.
25
25
 
26
- 1. **Removed and renamed imports fail first, at import.** The crosschain encoders
27
- left `ipor_fusion.fuses.crosschain` for `ipor_fusion.crosschain.fuses` (no shim);
28
- the event decoder modules `ipor_fusion.fuses.external_state_events` and
29
- `ipor_fusion.fuses.hypercore_events` are renamed `external_state_event_decoding`
30
- and `hypercore_event_decoding` (import their names from `ipor_fusion` or
31
- `ipor_fusion.fuses`); `IporFusionMarkets.RWA`, `MORPHO_BLUE_ADDRESS`, the 3.x cache
26
+ 1. **Removed and renamed imports fail first, at import.** The preview features
27
+ left the top level: crosschain names import from `ipor_fusion.crosschain`,
28
+ HyperCore names from the new `ipor_fusion.hypercore` (see
29
+ [Preview features leave the top level](#preview-features-leave-the-top-level));
30
+ the crosschain encoders left `ipor_fusion.fuses.crosschain` for
31
+ `ipor_fusion.crosschain.fuses` (no shim); the event decoder modules
32
+ `ipor_fusion.fuses.external_state_events` and `ipor_fusion.fuses.hypercore_events`
33
+ are renamed `external_state_event_decoding` and `hypercore_event_decoding` (import
34
+ the external-state names from `ipor_fusion` or `ipor_fusion.fuses`, the HyperCore
35
+ ones from `ipor_fusion.hypercore`); `IporFusionMarkets.RWA`, `MORPHO_BLUE_ADDRESS`, the 3.x cache
32
36
  functions, `read_erc20_holdings`, `ExternalStateExecutor.mark_nav` and `NavMark`
33
37
  are gone. See [Moved, removed and reshaped](#moved-removed-and-reshaped).
34
38
  2. **Wrappers are built from an address; execution takes the context.**
@@ -309,14 +313,14 @@ vocabulary `Severity`, `Verdict` and `Check`. Also new: `InFlightLimit` (see
309
313
  **Crosschain fuse encoders moved.** The crosschain market encoders moved from
310
314
  `ipor_fusion.fuses.crosschain` into the crosschain package, and
311
315
  `ipor_fusion.fuses` no longer re-exports them. There is no shim: the old paths
312
- raise `ImportError`. The top-level names (`from ipor_fusion import ...`) are
313
- unchanged.
316
+ raise `ImportError`. They are not top-level names either (see the next
317
+ paragraph).
314
318
 
315
319
  | 3.x import | 4.0 import |
316
320
  |---|---|
317
321
  | `ipor_fusion.fuses.crosschain` | `ipor_fusion.crosschain.fuses` (or `ipor_fusion.crosschain`) |
318
322
  | `ipor_fusion.fuses.crosschain.base`, `.ccip`, `.stargate` | `ipor_fusion.crosschain.fuses` (its submodules `base`, `ccip` and `stargate` exist but are internal) |
319
- | `from ipor_fusion.fuses import CcipCrosschainSupplyFuse` (and the other crosschain encoders, `SendParams`, `CrosschainSubstrate*`, `crosschain_market_id`) | `from ipor_fusion.crosschain import ...` or `from ipor_fusion import ...` |
323
+ | `from ipor_fusion.fuses import CcipCrosschainSupplyFuse` (and the other crosschain encoders, `SendParams`, `CrosschainSubstrate*`, `crosschain_market_id`) | `from ipor_fusion.crosschain import ...` |
320
324
 
321
325
  `ipor_fusion.crosschain` now exports the whole crosschain surface: besides the
322
326
  codecs and wrappers, the encoders, `CrosschainLane`, `CcipLane`, `StargateLane`,
@@ -325,6 +329,41 @@ the transports and chains, `discover_deployment`, `open_lane(s)`, `LANES` and
325
329
  `ipor_fusion.crosschain.ccip` and `.stargate` keep exporting only their codecs
326
330
  and wrappers.
327
331
 
332
+ #### Preview features leave the top level
333
+
334
+ Crosschain and HyperCore are preview features (`PREVIEW_FEATURES`): their names
335
+ may change in a minor release, which the top level's major-only removal promise
336
+ could not hold. 4.0 exports them only from their subpackages.
337
+
338
+ - **Crosschain:** the 124 crosschain names import from `ipor_fusion.crosschain`,
339
+ or from `crosschain.ccip` / `crosschain.stargate` / `crosschain.fuses` as before.
340
+ That covers lanes, discovery, transports, encoders, wrappers, codecs and
341
+ `CrosschainSimulator`. It also covers the crosschain ids (`AssetId`, `CommandId`,
342
+ `MessageId`, `LayerZeroEid`, `CcipChainSelector`, ...), which still import from
343
+ `ipor_fusion.types` too.
344
+ - **HyperCore:** the 97 HyperCore names import from the new
345
+ `ipor_fusion.hypercore`. That covers the fuses and `HyperCoreSubstrates`, the
346
+ readers and `read_hypercore_*`, the event classes, specs and decoders, and the
347
+ ids (`HyperCoreAsset`, `HyperCoreTokenIndex`, `MarginTableId`, `PayloadHash`,
348
+ ...). It also covers the constants and helpers (`SPOT_DEX`, `USDC_TOKEN_INDEX`,
349
+ `USDC_SYSTEM_ADDRESS`, `system_address`, `precompile_index_of`, `SettlementMode`,
350
+ `TimeInForce`, `TransferDirection`, ...). `HYPEREVM_CHAIN_ID` stays a top-level
351
+ chain constant. `ipor_fusion.fuses`
352
+ and `ipor_fusion.readers` no longer list them; the ids still import from
353
+ `ipor_fusion.types`.
354
+ - **Unchanged:** the exception classes (`HyperCoreEventDecodeError`,
355
+ `HyperCoreValuationError`, `CrosschainDiscoveryError`,
356
+ `VerifierResultUnavailable`, ...) stay top-level names of `ipor_fusion.errors`. The `vault info` document's HyperCore TypedDicts
357
+ (`HyperCoreJson`, ...) stay with the document.
358
+ - **Error registration:** `import ipor_fusion` no longer loads the crosschain
359
+ package. Import `ipor_fusion.crosschain` to register the crosschain contracts'
360
+ custom errors for decoding by name.
361
+
362
+ ```python
363
+ from ipor_fusion.crosschain import CcipLane, discover_deployment, open_lanes
364
+ from ipor_fusion.hypercore import HyperCoreDepositFuse, read_hypercore_vault_state
365
+ ```
366
+
328
367
  **Fuse base.** `Fuse`, `StakeFuse` and the shared validators and substrate packers
329
368
  moved to `ipor_fusion.core.fuse`. Import `Fuse` and `StakeFuse` from `ipor_fusion`
330
369
  or `ipor_fusion.fuses`. `ipor_fusion.fuses.base` still re-exports them in 4.0, but
@@ -343,7 +382,8 @@ The internal `ipor_fusion.fuses.base` still re-exports them. The CLI's internal
343
382
  from `ipor_fusion.fuses`, hid its submodule of the same name (`import
344
383
  ipor_fusion.fuses.hypercore_events as m` bound the function); the external-state
345
384
  module was renamed to match. Import the decoders with `from ipor_fusion import
346
- external_state_events, hypercore_events`; the modules are internal.
385
+ external_state_events` and `from ipor_fusion.hypercore import hypercore_events`;
386
+ the modules are internal.
347
387
 
348
388
  **Removed.**
349
389
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev210
3
+ Version: 4.0.0.dev215
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
@@ -388,8 +388,7 @@ renaming a name in it, or changing a signature incompatibly, waits for a major
388
388
  release; adding one does not.
389
389
 
390
390
  - **Public subpackages** declare their own `__all__`, each a subset of the top
391
- level: `ipor_fusion.core`, `config`, `fuses`, `readers`, `crosschain`,
392
- `crosschain.fuses`, `crosschain.ccip` and `crosschain.stargate`. `ipor_fusion.guide`
391
+ level: `ipor_fusion.core`, `config`, `fuses` and `readers`. `ipor_fusion.guide`
393
392
  (the packaged docs) keeps its names in its own namespace.
394
393
  - **Public modules** stay importable for the top-level names they define:
395
394
  `about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`, `field_docs`,
@@ -404,8 +403,12 @@ release; adding one does not.
404
403
  the subpackage or `ipor_fusion`), underscore names, and names in no `__all__`.
405
404
  They change without notice; the CLI and the MCP server are stable as commands
406
405
  and tools, not as Python modules.
407
- - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`: crosschain,
408
- HyperCore) are exported like the rest but may change in a minor release.
406
+ - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
407
+ from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
408
+ `crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
409
+ from the top level, and may change in a minor release. Their exception classes
410
+ stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
411
+ (`HyperCoreJson`, ...) stay with the document.
409
412
  - **Third-party types** are not re-exported: import `ChecksumAddress` and
410
413
  `HexAddress` from `eth_typing`, and `BlockIdentifier`, `Timestamp` and `TxParams`
411
414
  from `web3.types`. The SDK's own types (`ChainId`, `Amount`, `PlasmaVaultAddress`,
@@ -448,14 +451,6 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
448
451
  | `ExternalStateExecutor` | NAV propose/confirm for off-vault capital (market 50); the executor's thresholds (`staleness_max`, `big_change_bps`, `dust_threshold`, `min_update_interval`), the live aggregate (`get_balance_fuse_snapshot`) and the pre-hook's staleness clock (`get_oldest_update_timestamp`) |
449
452
  | `read_external_state`, `ExternalStateVaultState` | The market's vault-scoped state from the vault's ERC-7201 storage at one block: executor, the balance fuse's cached total, the custodian timestamp it last checked and the pause flag the pre-hook enforces (no getter exposes them) |
450
453
  | `decode_external_state_event`, `EXTERNAL_STATE_TOPICS` | The ExternalState events the vault emits (big change, cache updates, unpause, rescue, executor creation and deployment, operation enter/exit), decoded by topic with their raw log identity; a malformed listed log raises |
451
- | `decode_hypercore_event`, `hypercore_events` | **Preview.** The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract; a malformed listed log raises `HyperCoreEventDecodeError` |
452
- | `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | **Preview.** Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
453
- | `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
454
- | `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
455
- | `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
456
- | `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
457
- | `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
458
- | `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
459
454
  | `erc20_balance_slot`, `VaultSimulator.with_erc20_balance` | Fund any address with any ERC-20 in a simulation by a storage override (slot found by probing), no holder to impersonate |
460
455
  | `ERC20` | Token reads and approvals |
461
456
 
@@ -475,8 +470,24 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
475
470
  | Merkl | `MerklClaimWrapperFuse` |
476
471
  | Universal | `UniversalTokenSwapperFuse` |
477
472
  | Off-vault capital | `AsyncActionFuse` (market 40), `ExternalStateOperationFuse` (market 50) |
478
- | Crosschain (preview) | `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse` (market 54); transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` |
479
- | HyperCore (Hyperliquid, market 55, preview) | `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` |
473
+
474
+ ### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
475
+
476
+ Not production (see the note at the top) and outside the stable top level:
477
+ import these from their subpackage, and expect changes in a minor release.
478
+
479
+ | Name | Purpose |
480
+ |------|---------|
481
+ | `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
482
+ | `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
483
+ | `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
484
+ | `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
485
+ | `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
486
+ | `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
487
+ | `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
488
+ | `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
489
+ | Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
490
+ | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
480
491
 
481
492
  The mainnet crosschain POC vault uses a keccak-derived market ID, not 54. Use
482
493
  `crosschain_market_id("IPOR_FUSION_CROSSCHAIN_USDC_POC_V1")` for that deployment;
@@ -340,8 +340,7 @@ renaming a name in it, or changing a signature incompatibly, waits for a major
340
340
  release; adding one does not.
341
341
 
342
342
  - **Public subpackages** declare their own `__all__`, each a subset of the top
343
- level: `ipor_fusion.core`, `config`, `fuses`, `readers`, `crosschain`,
344
- `crosschain.fuses`, `crosschain.ccip` and `crosschain.stargate`. `ipor_fusion.guide`
343
+ level: `ipor_fusion.core`, `config`, `fuses` and `readers`. `ipor_fusion.guide`
345
344
  (the packaged docs) keeps its names in its own namespace.
346
345
  - **Public modules** stay importable for the top-level names they define:
347
346
  `about`, `cache`, `chains`, `dependency_graph`, `errors`, `explorer`, `field_docs`,
@@ -356,8 +355,12 @@ release; adding one does not.
356
355
  the subpackage or `ipor_fusion`), underscore names, and names in no `__all__`.
357
356
  They change without notice; the CLI and the MCP server are stable as commands
358
357
  and tools, not as Python modules.
359
- - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`: crosschain,
360
- HyperCore) are exported like the rest but may change in a minor release.
358
+ - **Preview features** (`PREVIEW_FEATURES` in `ipor_fusion.about`) export only
359
+ from their own subpackages, `ipor_fusion.crosschain` (with `crosschain.fuses`,
360
+ `crosschain.ccip` and `crosschain.stargate`) and `ipor_fusion.hypercore`, never
361
+ from the top level, and may change in a minor release. Their exception classes
362
+ stay in `ipor_fusion.errors`, and the `vault info` document's HyperCore blocks
363
+ (`HyperCoreJson`, ...) stay with the document.
361
364
  - **Third-party types** are not re-exported: import `ChecksumAddress` and
362
365
  `HexAddress` from `eth_typing`, and `BlockIdentifier`, `Timestamp` and `TxParams`
363
366
  from `web3.types`. The SDK's own types (`ChainId`, `Amount`, `PlasmaVaultAddress`,
@@ -400,14 +403,6 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
400
403
  | `ExternalStateExecutor` | NAV propose/confirm for off-vault capital (market 50); the executor's thresholds (`staleness_max`, `big_change_bps`, `dust_threshold`, `min_update_interval`), the live aggregate (`get_balance_fuse_snapshot`) and the pre-hook's staleness clock (`get_oldest_update_timestamp`) |
401
404
  | `read_external_state`, `ExternalStateVaultState` | The market's vault-scoped state from the vault's ERC-7201 storage at one block: executor, the balance fuse's cached total, the custodian timestamp it last checked and the pause flag the pre-hook enforces (no getter exposes them) |
402
405
  | `decode_external_state_event`, `EXTERNAL_STATE_TOPICS` | The ExternalState events the vault emits (big change, cache updates, unpause, rescue, executor creation and deployment, operation enter/exit), decoded by topic with their raw log identity; a malformed listed log raises |
403
- | `decode_hypercore_event`, `hypercore_events` | **Preview.** The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract; a malformed listed log raises `HyperCoreEventDecodeError` |
404
- | `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | **Preview.** Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
405
- | `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
406
- | `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
407
- | `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
408
- | `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
409
- | `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
410
- | `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
411
406
  | `erc20_balance_slot`, `VaultSimulator.with_erc20_balance` | Fund any address with any ERC-20 in a simulation by a storage override (slot found by probing), no holder to impersonate |
412
407
  | `ERC20` | Token reads and approvals |
413
408
 
@@ -427,8 +422,24 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
427
422
  | Merkl | `MerklClaimWrapperFuse` |
428
423
  | Universal | `UniversalTokenSwapperFuse` |
429
424
  | Off-vault capital | `AsyncActionFuse` (market 40), `ExternalStateOperationFuse` (market 50) |
430
- | Crosschain (preview) | `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse` (market 54); transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` |
431
- | HyperCore (Hyperliquid, market 55, preview) | `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` |
425
+
426
+ ### Preview features (`ipor_fusion.crosschain`, `ipor_fusion.hypercore`)
427
+
428
+ Not production (see the note at the top) and outside the stable top level:
429
+ import these from their subpackage, and expect changes in a minor release.
430
+
431
+ | Name | Purpose |
432
+ |------|---------|
433
+ | `StargateCrosschainExecutor`, `CcipCrosschainExecutor` | Crosschain executor reads and attestation (`propose_balance`, `approve_balance`) |
434
+ | `StargateCrosschainDispatcher`, `CcipCrosschainDispatcher` | Remote dispatcher state (`observation`, tracked idle, command lane) |
435
+ | `StargateCrosschainFactory`, `CcipCrosschainFactory` | Executor creation and route/asset configuration reads |
436
+ | `CrosschainLane`, `open_lane` | One executor/dispatcher pair driven transport-agnostically: supply, recall, command, claim, buckets, attestation (`attestation`, `needs_attestation`, `staleness_max`); `enforces_min_received` identifies real supply floors (CCIP requires zero); `open_lane` detects the transport and finds the fuses |
437
+ | `discover_deployment`, `open_lanes` | Read a vault's crosschain market from the hub alone (executors with transport, factory, fuses, attestation keys and spokes served; remote vaults per spoke) and open every lane; `LANES` maps a transport kind to its lane class |
438
+ | `CrosschainSimulator` | Multi-chain `eth_simulateV1` relay: replays LayerZero and CCIP messages between pinned chains by impersonating the endpoint or router on delivery, no bridge needed |
439
+ | `ccip_token_lane` | Whether a CCIP message lane exists from a chain and whether a token's pool serves it, read on Chainlink's Router, OnRamp, TokenAdminRegistry and pool |
440
+ | `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse, pending-library, settlement and reporter events, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
441
+ | Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
442
+ | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
432
443
 
433
444
  The mainnet crosschain POC vault uses a keccak-derived market ID, not 54. Use
434
445
  `crosschain_market_id("IPOR_FUSION_CROSSCHAIN_USDC_POC_V1")` for that deployment;
@@ -73,43 +73,45 @@ from web3.types import BlockIdentifier, RPCEndpoint, Timestamp
73
73
 
74
74
  from ipor_fusion import (
75
75
  ERC20,
76
- SPOT_DEX,
77
- USDC_SYSTEM_ADDRESS,
78
- USDC_TOKEN_INDEX,
79
76
  AccountOverride,
80
- CcipChain,
81
- CcipChainSelector,
82
- CcipCrosschainExecutor,
83
- CcipTransport,
84
- Command,
85
- CrosschainLane,
86
- CrosschainSimulator,
87
77
  FuseAction,
88
- HyperCoreReader,
89
- LaneObservation,
90
78
  PlasmaVault,
91
79
  SimulationResult,
92
80
  SubstrateInfo,
93
- TimeInForce,
94
81
  VaultSimulator,
95
82
  Web3Context,
96
- ccip_events,
97
83
  decode_custom_error,
98
84
  decode_substrate,
99
85
  erc20_balance_slot,
100
- open_lane,
101
86
  parse_fuse_address,
102
87
  parse_plasma_vault_address,
103
- precompile_index_of,
104
- quote_ccip_native_fee,
105
- read_hypercore_evm_exit_ceiling,
106
- read_hypercore_vault_state,
107
88
  register_custom_errors,
108
89
  )
109
- from ipor_fusion.fuses import (
90
+ from ipor_fusion.crosschain import (
91
+ CcipChain,
92
+ CcipChainSelector,
93
+ CcipCrosschainExecutor,
94
+ CcipTransport,
95
+ Command,
96
+ CrosschainLane,
97
+ CrosschainSimulator,
98
+ LaneObservation,
99
+ ccip_events,
100
+ open_lane,
101
+ quote_ccip_native_fee,
102
+ )
103
+ from ipor_fusion.hypercore import (
104
+ SPOT_DEX,
105
+ USDC_SYSTEM_ADDRESS,
106
+ USDC_TOKEN_INDEX,
110
107
  HyperCoreDepositFuse,
111
108
  HyperCoreOrderFuse,
109
+ HyperCoreReader,
112
110
  HyperCoreSendFuse,
111
+ TimeInForce,
112
+ precompile_index_of,
113
+ read_hypercore_evm_exit_ceiling,
114
+ read_hypercore_vault_state,
113
115
  )
114
116
  from ipor_fusion.market_ids import IporFusionMarkets
115
117
  from ipor_fusion.types import (
@@ -45,7 +45,7 @@ executors submit into HyperEVM's 3 M-gas small blocks. Every lifecycle message
45
45
  here carries the factory route's 2 M and is executed automatically, but the
46
46
  one-time dispatcher deployment ticket carries 6 M and has to be executed by
47
47
  anyone through the permissionless ``OffRamp.execute``
48
- (``ipor_fusion.manual_execution``). The deployment below already has its
48
+ (``ipor_fusion.crosschain.manual_execution``). The deployment below already has its
49
49
  dispatcher; the relay delivers every message directly.
50
50
 
51
51
  Run it (the shell snippets assume a POSIX shell -- bash or zsh):
@@ -70,6 +70,15 @@ from web3.types import Timestamp
70
70
 
71
71
  from ipor_fusion import (
72
72
  ERC20,
73
+ PlasmaVault,
74
+ SimulationResult,
75
+ VaultSimulator,
76
+ Web3Context,
77
+ erc20_balance_slot,
78
+ is_simulate_v1_supported,
79
+ parse_plasma_vault_address,
80
+ )
81
+ from ipor_fusion.crosschain import (
73
82
  CcipChain,
74
83
  CcipChainSelector,
75
84
  CcipTransport,
@@ -77,14 +86,7 @@ from ipor_fusion import (
77
86
  CrosschainLane,
78
87
  CrosschainSimulator,
79
88
  LaneObservation,
80
- PlasmaVault,
81
- SimulationResult,
82
- VaultSimulator,
83
- Web3Context,
84
- erc20_balance_slot,
85
- is_simulate_v1_supported,
86
89
  open_lane,
87
- parse_plasma_vault_address,
88
90
  )
89
91
  from ipor_fusion.market_ids import IporFusionMarkets
90
92
  from ipor_fusion.types import Amount, ChainId, Decimals, Period, Shares
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev210"
3
+ version = "4.0.0.dev215"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -41,8 +41,13 @@ from eth_utils import function_signature_to_4byte_selector, keccak
41
41
  from web3 import Web3
42
42
  from web3.types import BlockData, LogReceipt, RPCEndpoint
43
43
 
44
- from ipor_fusion import ERC20, Call, Web3Context, ccip_token_lane
45
- from ipor_fusion.crosschain import CcipCrosschainFactory, CcipOffRamp, CcipRouter
44
+ from ipor_fusion import ERC20, Call, Web3Context
45
+ from ipor_fusion.crosschain import (
46
+ CcipCrosschainFactory,
47
+ CcipOffRamp,
48
+ CcipRouter,
49
+ ccip_token_lane,
50
+ )
46
51
  from ipor_fusion.types import AssetId, CcipChainSelector, ChainId
47
52
 
48
53
  T = TypeVar("T")