ipor-fusion 4.0.0.dev266__tar.gz → 4.0.0.dev272__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 (344) hide show
  1. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/MIGRATION_4.md +14 -0
  2. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/PKG-INFO +2 -1
  3. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/pyproject.toml +2 -1
  4. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/__init__.py +2 -0
  5. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/plasma_vault.py +26 -6
  6. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/types.py +2 -0
  7. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_public_api.py +4 -2
  8. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_plasma_vault_setters_base.py +9 -1
  9. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/typed_client/consumer.py +5 -0
  10. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/typed_client/rejected.py +3 -0
  11. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/uv.lock +6 -4
  12. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.claude-plugin/marketplace.json +0 -0
  13. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.claude-plugin/plugin.json +0 -0
  14. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.env.example +0 -0
  15. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.gemini/settings.json +0 -0
  16. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.git-blame-ignore-revs +0 -0
  17. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/cd.yml +0 -0
  18. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/ci.yml +0 -0
  19. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/commit-lint.yml +0 -0
  20. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/notify-slack.yml +0 -0
  21. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/python-build.yml +0 -0
  22. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/python-publish.yml +0 -0
  23. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/release.yml +0 -0
  24. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.github/workflows/report-slack.yml +0 -0
  25. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.gitignore +0 -0
  26. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.mcp.json +0 -0
  27. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.pre-commit-config.yaml +0 -0
  28. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/.python-version +0 -0
  29. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/AGENTS.md +0 -0
  30. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/CHANGELOG.md +0 -0
  31. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/CLAUDE.md +0 -0
  32. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/CODEOWNERS +0 -0
  33. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/LICENSE +0 -0
  34. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/README.md +0 -0
  35. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/build.sh +0 -0
  36. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/CONTRIBUTING.md +0 -0
  37. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/README.md +0 -0
  38. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  39. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  40. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  41. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  42. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/external_state_margin_leg_base.py +0 -0
  43. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/examples/simple_aave_v3_supply_base.py +0 -0
  44. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/pytest.ini +0 -0
  45. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/scripts/commit-check.sh +0 -0
  46. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/scripts/crosschain_readiness.py +0 -0
  47. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/skills/ipor-deploy-vault/SKILL.md +0 -0
  48. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/about.py +0 -0
  49. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cache.py +0 -0
  50. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/chains.py +0 -0
  51. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/__init__.py +0 -0
  52. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  53. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/config_cmd.py +0 -0
  54. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/config_store.py +0 -0
  55. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/main.py +0 -0
  56. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/market_cmd.py +0 -0
  57. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/options.py +0 -0
  58. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  59. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  60. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/vault_health.py +0 -0
  61. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  62. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  63. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  64. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/config/__init__.py +0 -0
  65. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/config/roles.py +0 -0
  66. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/__init__.py +0 -0
  67. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/access.py +0 -0
  68. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/address.py +0 -0
  69. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/context.py +0 -0
  70. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/context_manager.py +0 -0
  71. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/contract.py +0 -0
  72. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/erc20.py +0 -0
  73. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/external_state_executor.py +0 -0
  74. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/fee_manager.py +0 -0
  75. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/fuse.py +0 -0
  76. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/fuse_action.py +0 -0
  77. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/fusion_factory.py +0 -0
  78. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/logs.py +0 -0
  79. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/multicall.py +0 -0
  80. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/oracle.py +0 -0
  81. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/rewards_manager.py +0 -0
  82. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/simulation.py +0 -0
  83. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/simulation_result.py +0 -0
  84. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  85. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/__init__.py +0 -0
  86. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  87. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  88. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  89. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  90. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  91. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  92. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  93. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  94. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  95. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/contracts.py +0 -0
  96. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/discovery.py +0 -0
  97. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/errors.py +0 -0
  98. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  99. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  100. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  101. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  102. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/lane.py +0 -0
  103. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/logs.py +0 -0
  104. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/messages.py +0 -0
  105. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/simulation.py +0 -0
  106. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  107. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  108. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  109. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  110. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  111. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/crosschain/transport.py +0 -0
  112. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/dependency_graph.py +0 -0
  113. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/entry_cli.py +0 -0
  114. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/entry_mcp.py +0 -0
  115. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/errors.py +0 -0
  116. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/explorer.py +0 -0
  117. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/field_docs.py +0 -0
  118. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/__init__.py +0 -0
  119. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  120. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/async_action.py +0 -0
  121. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/base.py +0 -0
  122. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  123. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/erc4626.py +0 -0
  124. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  125. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/events.py +0 -0
  126. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/external_state.py +0 -0
  127. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  128. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  129. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  130. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/hypercore.py +0 -0
  131. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  132. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/merkl.py +0 -0
  133. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/morpho.py +0 -0
  134. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  135. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  136. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/fuses/universal.py +0 -0
  137. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/guide/__init__.py +0 -0
  138. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/guide/architecture.md +0 -0
  139. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/guide/glossary.md +0 -0
  140. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/guide/invariants.md +0 -0
  141. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/guide/quickstart.md +0 -0
  142. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/hypercore/__init__.py +0 -0
  143. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/market_ids.py +0 -0
  144. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/market_info.py +0 -0
  145. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/mcp/__init__.py +0 -0
  146. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/mcp/guide.py +0 -0
  147. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/mcp/models.py +0 -0
  148. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/mcp/server.py +0 -0
  149. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/morpho_api.py +0 -0
  150. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/py.typed +0 -0
  151. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/__init__.py +0 -0
  152. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/aave_v3.py +0 -0
  153. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/aave_v4.py +0 -0
  154. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/compound_v3.py +0 -0
  155. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/hypercore.py +0 -0
  156. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  157. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/lending_health.py +0 -0
  158. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/morpho.py +0 -0
  159. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  160. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  161. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  162. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/position_manager.py +0 -0
  163. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  164. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  165. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/readers/unpriceable.py +0 -0
  166. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/substrates.py +0 -0
  167. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/validation.py +0 -0
  168. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_data.py +0 -0
  169. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_erc20.py +0 -0
  170. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_info.py +0 -0
  171. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_managers.py +0 -0
  172. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_positions.py +0 -0
  173. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/src/ipor_fusion/vault_reads.py +0 -0
  174. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/UniswapV3UniversalRouter.py +0 -0
  175. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_crosschain.py +0 -0
  176. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_crosschain_lifecycle.py +0 -0
  177. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_crosschain_recovery.py +0 -0
  178. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_euler_v2.py +0 -0
  179. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_event_args.py +0 -0
  180. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_fake_rpc.py +0 -0
  181. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_foundry.py +0 -0
  182. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_golden.py +0 -0
  183. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_guide.py +0 -0
  184. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_hypercore_model.py +0 -0
  185. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_hypercore_shadow.py +0 -0
  186. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_live.py +0 -0
  187. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_multicall.py +0 -0
  188. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_oracle_mapping_fake.py +0 -0
  189. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_simulate.py +0 -0
  190. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/_validation.py +0 -0
  191. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/addresses.py +0 -0
  192. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/conftest.py +0 -0
  193. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/constants.py +0 -0
  194. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  195. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/hypercore_market55.json +0 -0
  196. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  197. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  198. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  199. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  200. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  201. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  202. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  203. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  204. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  205. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  206. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  207. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  208. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  209. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  210. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  211. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  212. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/simulate_v1_request.json +0 -0
  213. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/clean.json +0 -0
  214. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  215. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  216. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  217. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  218. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  219. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  220. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  221. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  222. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/full.json +0 -0
  223. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  224. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/full.txt +0 -0
  225. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/rich.json +0 -0
  226. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  227. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  228. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_about.py +0 -0
  229. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_access_manager.py +0 -0
  230. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cache.py +0 -0
  231. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_chains.py +0 -0
  232. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_changelog.py +0 -0
  233. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_commands.py +0 -0
  234. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_config_store.py +0 -0
  235. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_helpers.py +0 -0
  236. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_hypercore.py +0 -0
  237. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_lending_health.py +0 -0
  238. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_market_golden.py +0 -0
  239. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_market_morpho_blue.py +0 -0
  240. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_mcp_parity.py +0 -0
  241. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_oracle_mapping.py +0 -0
  242. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_oracle_mapping_golden.py +0 -0
  243. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_pending_requests_scan.py +0 -0
  244. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_role_accounts.py +0 -0
  245. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_vault_info_golden.py +0 -0
  246. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_vault_predates_getters.py +0 -0
  247. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_cli_vault_validate.py +0 -0
  248. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_contract_call.py +0 -0
  249. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_contract_encoder.py +0 -0
  250. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_ccip_events.py +0 -0
  251. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_ccip_indexer.py +0 -0
  252. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_ccip_quote.py +0 -0
  253. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_chainlink.py +0 -0
  254. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_contracts.py +0 -0
  255. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_encoding.py +0 -0
  256. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_errors.py +0 -0
  257. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_lane.py +0 -0
  258. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_layering.py +0 -0
  259. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_readiness.py +0 -0
  260. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_readiness_report.py +0 -0
  261. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_crosschain_transport.py +0 -0
  262. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_docs_typing.py +0 -0
  263. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_erc20.py +0 -0
  264. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_error_hierarchy.py +0 -0
  265. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_examples_composed_hypercore.py +0 -0
  266. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_examples_crosschain.py +0 -0
  267. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  268. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_examples_vaults.py +0 -0
  269. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_explorer.py +0 -0
  270. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_external_state_events.py +0 -0
  271. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_external_state_executor.py +0 -0
  272. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_fee_manager.py +0 -0
  273. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_fuse_encoding.py +0 -0
  274. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_fusion_instance.py +0 -0
  275. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_governance_wrappers.py +0 -0
  276. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_guide.py +0 -0
  277. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_deployment.py +0 -0
  278. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_events.py +0 -0
  279. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_flow.py +0 -0
  280. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_live.py +0 -0
  281. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_outcome.py +0 -0
  282. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_readers.py +0 -0
  283. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_hypercore_simulation.py +0 -0
  284. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_logs.py +0 -0
  285. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_mcp_hypercore.py +0 -0
  286. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_mcp_models.py +0 -0
  287. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_mcp_server.py +0 -0
  288. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_mcp_vault_validate.py +0 -0
  289. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_multicall.py +0 -0
  290. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_oracle.py +0 -0
  291. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_oracle_mapping.py +0 -0
  292. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_plasma_vault.py +0 -0
  293. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_public_type_reachability.py +0 -0
  294. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_reader_encoding.py +0 -0
  295. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_readiness_selection.py +0 -0
  296. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_revert_decoding.py +0 -0
  297. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_rewards_manager.py +0 -0
  298. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_roles.py +0 -0
  299. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_sdk_layering.py +0 -0
  300. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  301. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  302. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  303. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_crosschain_canary.py +0 -0
  304. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_crosschain_hypercore.py +0 -0
  305. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  306. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  307. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  308. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  309. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  310. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  311. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  312. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_examples_arbitrum.py +0 -0
  313. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_examples_base.py +0 -0
  314. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_examples_crosschain.py +0 -0
  315. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_external_state_executor_base.py +0 -0
  316. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  317. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  318. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  319. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_morpho_blue.py +0 -0
  320. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_pilot_v3.py +0 -0
  321. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  322. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  323. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  324. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_readers_integration.py +0 -0
  325. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_release_funds.py +0 -0
  326. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_swap_on_base.py +0 -0
  327. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  328. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulation_errors.py +0 -0
  329. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_simulation_observation.py +0 -0
  330. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_solidity_compiler.py +0 -0
  331. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_solidity_mirrors.py +0 -0
  332. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_substrates.py +0 -0
  333. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_types_and_events.py +0 -0
  334. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_unpriceable_tokens.py +0 -0
  335. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_validation.py +0 -0
  336. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_data_block.py +0 -0
  337. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_dep_graph.py +0 -0
  338. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_info_fetched_golden.py +0 -0
  339. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_info_onchain_base.py +0 -0
  340. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  341. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  342. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_vault_simulator_blocks.py +0 -0
  343. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_web3_context.py +0 -0
  344. {ipor_fusion-4.0.0.dev266 → ipor_fusion-4.0.0.dev272}/tests/test_withdraw_manager.py +0 -0
@@ -647,6 +647,7 @@ label values; they do not validate byte widths or address spelling.
647
647
  | `MarketId` | an `IporFusionMarkets` member, or `MarketId(n)` |
648
648
  | `RoleId` | a `Roles` member (accepted as is), or `RoleId(n)`; `Roles.resolve(name)` returns one |
649
649
  | `Decimals`, `Period`, `Amount`, `Shares`, ... | `Decimals(8)`, `Period(0)`, `Amount(n)`, `Shares(n)` |
650
+ | `Wad` | `Wad(6 * 10**17)` (60%): an 18-decimal fraction, `10**18` is 100% |
650
651
  | `ChecksumAddress` | `Web3.to_checksum_address(value)` |
651
652
  | `HexAddress` | any `ChecksumAddress`, or `parse_hex_address(value)` (20 bytes or `0x`/`0X`-prefixed hex in any case → lowercase `0x` form) |
652
653
  | `MorphoBlueMarketId` | `parse_morpho_market_id(value)`: 32 bytes or hex in any spelling, always `0x` + 64 lowercase digits |
@@ -686,6 +687,8 @@ converted amounts `Amount`. A custom `VaultState` annotates the same.
686
687
  `PlasmaVault.total_supply()`, `balance_of()` and `get_total_supply_cap()` return
687
688
  `Shares` (vault shares), and `transfer` / `approve` / `transfer_from` /
688
689
  `set_total_supply_cap` take `Shares`; `ERC20` keeps `Amount`.
690
+ `PlasmaVault.setup_markets_limits` takes `Sequence[tuple[MarketId, Wad]]`: each
691
+ limit is a share of total assets, not an asset amount (see Behavior changes).
689
692
  `Reconciliation` amounts (`balance_fuses_total`, `underlying_on_vault`,
690
693
  `rewards_manager_balance`, `erc20_direct_total`, `sum`, `on_chain_total_assets`, `delta`,
691
694
  `pending_withdrawals`, `implied_market_total`, `market_storage_divergence`) are
@@ -1001,6 +1004,17 @@ and `log_index` was passed through as given (a hex string from a raw log); the e
1001
1004
  These apply to every caller, type-checked or not. Changes described in full above
1002
1005
  are listed with a link.
1003
1006
 
1007
+ - **`PlasmaVault.setup_markets_limits` takes WAD shares and validates them.** The
1008
+ contract (`AssetDistributionProtectionLib.MarketLimit.limitInPercentage`) reads each
1009
+ limit as the most of the vault's total assets the market may hold, `10**18` being
1010
+ 100%; 3.x typed it as an `Amount` and documented it as an asset amount, so a limit
1011
+ set "in asset units" (`1_000_000` for 1 USDC) became a near-zero share that blocks
1012
+ the market once limits are activated. It now takes `Wad` and raises `ValueError`
1013
+ before building the call for a limit outside `0..10**18`: a negative one is no
1014
+ uint256, and above 100% the vault reverts `MarketLimitSetupInPercentageIsTooHigh`. Pass the share: `Wad(6 * 10**17)` for 60%. Check limits
1015
+ set with 3.x with `PlasmaVault.get_market_limit(market).call(ctx)`, which
1016
+ returns the `Wad` share.
1017
+
1004
1018
  - **The CLI and the MCP tools take the same arguments.**
1005
1019
  - **MCP inputs:** the vault tools' `chain_id` and every `block_number` are
1006
1020
  optional and omitted means auto-detected / latest; `market_morpho_blue` and
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev266
3
+ Version: 4.0.0.dev272
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
@@ -28,6 +28,7 @@ Classifier: Topic :: Office/Business :: Financial :: Investment
28
28
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
29
  Classifier: Topic :: Utilities
30
30
  Requires-Python: >=3.11
31
+ Requires-Dist: certifi>=2026.10.19
31
32
  Requires-Dist: eth-abi<6,>=5.1.0
32
33
  Requires-Dist: eth-account<1,>=0.13
33
34
  Requires-Dist: eth-typing<7,>=6.0.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev266"
3
+ version = "4.0.0.dev272"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -31,6 +31,7 @@ classifiers = [
31
31
  "Natural Language :: English",
32
32
  ]
33
33
  dependencies = [
34
+ "certifi>=2026.10.19",
34
35
  "eth-account>=0.13,<1",
35
36
  "eth-typing>=6.0.0,<7",
36
37
  "eth-abi>=5.1.0,<6",
@@ -334,6 +334,7 @@ from ipor_fusion.types import (
334
334
  TokenId,
335
335
  TxHash,
336
336
  Verdict,
337
+ Wad,
337
338
  format_amount,
338
339
  format_shares,
339
340
  parse_access_manager_address,
@@ -611,6 +612,7 @@ __all__ = [
611
612
  "Liquidity",
612
613
  "RoleId",
613
614
  "ChainId",
615
+ "Wad",
614
616
  "MorphoBlueMarketId",
615
617
  "ProposalHash",
616
618
  "TxHash",
@@ -30,10 +30,13 @@ from ipor_fusion.types import (
30
30
  PlasmaVaultAddress,
31
31
  RoleId,
32
32
  Shares,
33
+ Wad,
33
34
  )
34
35
 
35
36
  T = TypeVar("T")
36
37
 
38
+ WAD = Wad(10**18)
39
+
37
40
  _BALANCE_FUSE_ADDED_TOPIC = HexBytes(
38
41
  Web3.keccak(text="BalanceFuseAdded(uint256,address)")
39
42
  )
@@ -358,8 +361,24 @@ class PlasmaVault(ContractWrapper):
358
361
  bytes(selector),
359
362
  )
360
363
 
361
- def setup_markets_limits(self, limits: list[tuple[MarketId, Amount]]) -> Call[None]:
362
- """ATOMIST-only: set per-market cap in the underlying asset's smallest unit."""
364
+ def setup_markets_limits(
365
+ self, limits: Sequence[tuple[MarketId, Wad]]
366
+ ) -> Call[None]:
367
+ """Set each market's limit: the most of the vault's total assets the
368
+ market may hold, as a `Wad` share (``Wad(6 * 10**17)`` is 60%), enforced
369
+ once `activate_markets_limits` is on (AssetDistributionProtectionLib).
370
+
371
+ Raises ``ValueError`` for a limit outside ``0..10**18``: a negative one is
372
+ no uint256, and the vault reverts ``MarketLimitSetupInPercentageIsTooHigh``
373
+ above 100%.
374
+ """
375
+ for market, limit in limits:
376
+ if not 0 <= limit <= WAD:
377
+ raise ValueError(
378
+ f"market {market} limit {limit}: expected a WAD share in"
379
+ " 0..10**18; above 100% the vault reverts"
380
+ " MarketLimitSetupInPercentageIsTooHigh"
381
+ )
363
382
  return self._write("setupMarketsLimits((uint256,uint256)[])", list(limits))
364
383
 
365
384
  def update_markets_balances(self, market_ids: list[MarketId]) -> Call[None]:
@@ -507,11 +526,12 @@ class PlasmaVault(ContractWrapper):
507
526
  "isMarketsLimitsActivated()", output_types=["bool"], decoder=bool
508
527
  )
509
528
 
510
- def get_market_limit(self, market: MarketId) -> Call[int]:
511
- """The most of the vault's total assets ``market`` may hold, as a WAD
512
- share (``10**18`` is 100%), enforced only while limits are activated."""
529
+ def get_market_limit(self, market: MarketId) -> Call[Wad]:
530
+ """The most of the vault's total assets ``market`` may hold, as a `Wad`
531
+ share (``10**18`` is 100%), enforced only while limits are activated;
532
+ `setup_markets_limits` sets it."""
513
533
  return self._view(
514
- "getMarketLimit(uint256)", market, output_types=["uint256"], decoder=int
534
+ "getMarketLimit(uint256)", market, output_types=["uint256"], decoder=Wad
515
535
  )
516
536
 
517
537
  def activate_markets_limits(self) -> Call[None]:
@@ -15,6 +15,8 @@ Tick = NewType("Tick", int)
15
15
  Liquidity = NewType("Liquidity", int)
16
16
  RoleId = NewType("RoleId", int)
17
17
  ChainId = NewType("ChainId", int)
18
+ # An 18-decimal fixed-point fraction: 10**18 is 1, i.e. 100% (a market limit).
19
+ Wad = NewType("Wad", int)
18
20
  # A Morpho Blue market id (bytes32) in its canonical spelling: "0x" and 64
19
21
  # lowercase hex digits, as the Morpho API reports it. Build one with
20
22
  # parse_morpho_market_id.
@@ -73,6 +73,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
73
73
  "CacheField",
74
74
  "CacheKey",
75
75
  "Call",
76
+ "CallPermission",
76
77
  "ChainId",
77
78
  "ChainlinkDetailJson",
78
79
  "ChangelogEntry",
@@ -80,6 +81,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
80
81
  "CloneArgs",
81
82
  "CompoundV3Reader",
82
83
  "CompoundV3SupplyFuse",
84
+ "ContextManager",
83
85
  "ContractCache",
84
86
  "ContractNotFoundError",
85
87
  "CrosschainDiscoveryError",
@@ -170,7 +172,6 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
170
172
  "HyperCorePerpMarketJson",
171
173
  "HyperCoreSpotLegJson",
172
174
  "HyperCoreValuationError",
173
- "ContextManager",
174
175
  "InFlightLimit",
175
176
  "IporFusionError",
176
177
  "IporFusionMarkets",
@@ -272,7 +273,6 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
272
273
  "RoleAccountJson",
273
274
  "RoleAccountsJson",
274
275
  "RoleId",
275
- "CallPermission",
276
276
  "RoleStatus",
277
277
  "Roles",
278
278
  "SUPPORTED_CHAIN_IDS",
@@ -333,6 +333,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
333
333
  "Verdict",
334
334
  "VerifierResultUnavailable",
335
335
  "VestingData",
336
+ "Wad",
336
337
  "Web3Context",
337
338
  "WithdrawManager",
338
339
  "WithdrawManagerData",
@@ -1112,6 +1113,7 @@ _MODULE_PATH_SNAPSHOT: dict[str, frozenset[str]] = {
1112
1113
  "TransferId",
1113
1114
  "TxHash",
1114
1115
  "Verdict",
1116
+ "Wad",
1115
1117
  "ZERO_ADDRESS",
1116
1118
  "format_amount",
1117
1119
  "format_shares",
@@ -20,6 +20,7 @@ from __future__ import annotations
20
20
 
21
21
  import logging
22
22
 
23
+ import pytest
23
24
  from eth_abi import decode as abi_decode
24
25
  from eth_utils import function_signature_to_4byte_selector
25
26
  from web3 import Web3
@@ -97,7 +98,8 @@ def test_grant_market_substrates_calldata_selector_and_roundtrip():
97
98
 
98
99
 
99
100
  def test_setup_markets_limits_calldata_selector_and_roundtrip():
100
- pairs = [(1, 1_000_000_000_000), (2, 500_000_000_000)]
101
+ # MarketLimit(AAVE_V3_MARKET_ID, 6e17) // 60%, as in the contracts' PlasmaVaultBasic test.
102
+ pairs = [(1, 6 * 10**17), (2, 10**18), (3, 0)]
101
103
  calldata = _bare_vault().setup_markets_limits(pairs).calldata
102
104
  assert calldata[:4] == function_signature_to_4byte_selector(
103
105
  "setupMarketsLimits((uint256,uint256)[])"
@@ -106,6 +108,12 @@ def test_setup_markets_limits_calldata_selector_and_roundtrip():
106
108
  assert [(int(mkt), int(cap)) for mkt, cap in decoded] == pairs
107
109
 
108
110
 
111
+ @pytest.mark.parametrize("limit", [10**18 + 1, -1])
112
+ def test_setup_markets_limits_rejects_a_limit_outside_a_wad_share(limit):
113
+ with pytest.raises(ValueError, match="expected a WAD share in 0..10"):
114
+ _bare_vault().setup_markets_limits([(1, 10**17), (2, limit)])
115
+
116
+
109
117
  def test_configure_instant_withdrawal_fuses_calldata_selector_and_roundtrip():
110
118
  sub1 = b"\x11" * 32
111
119
  sub2 = b"\x22" * 32
@@ -56,6 +56,7 @@ from ipor_fusion import (
56
56
  TransactionError,
57
57
  VaultInfoJson,
58
58
  VaultSimulator,
59
+ Wad,
59
60
  Web3Context,
60
61
  build_meta_morpho_json,
61
62
  build_morpho_blue_market_json,
@@ -120,6 +121,10 @@ def access(ctx: Web3Context, am: AccessManager, account: ChecksumAddress) -> Non
120
121
  am.read_accounts_with_role(ctx, Roles.resolve("ATOMIST"))
121
122
 
122
123
 
124
+ def market_limits(vault: PlasmaVault) -> None:
125
+ vault.setup_markets_limits([(IporFusionMarkets.AAVE_V3, Wad(6 * 10**17))])
126
+
127
+
123
128
  def governance(vault: PlasmaVault) -> None:
124
129
  vault.set_minimal_execution_delays_for_roles(
125
130
  [(Roles.ALPHA_ROLE, Period.HOUR), (RoleId(100), Period(0))]
@@ -14,6 +14,7 @@ from ipor_fusion import (
14
14
  ChainId,
15
15
  ExternalStateEvent,
16
16
  ExternalStateExecutor,
17
+ MarketId,
17
18
  MorphoBlueMarketJson,
18
19
  Multicall3,
19
20
  PlasmaVault,
@@ -74,6 +75,8 @@ def roles_do_not_mix(ctx: Web3Context, vault: PlasmaVaultAddress) -> None:
74
75
  pv = PlasmaVault(vault)
75
76
  pv.configure_instant_withdrawal_fuses([(pv.address, [])]) # pyright: ignore[reportArgumentType]
76
77
  HyperCorePendingReader(pv, pv.address) # pyright: ignore[reportArgumentType]
78
+ # A market limit is a WAD share of total assets, not an asset amount.
79
+ pv.setup_markets_limits([(MarketId(1), Amount(10**6))]) # pyright: ignore[reportArgumentType]
77
80
 
78
81
 
79
82
  def selectors_are_not_chain_ids(factory: CcipCrosschainFactory) -> None:
@@ -1,5 +1,5 @@
1
1
  version = 1
2
- revision = 5
2
+ revision = 3
3
3
  requires-python = ">=3.11"
4
4
  resolution-markers = [
5
5
  "python_full_version >= '3.14' and sys_platform == 'win32'",
@@ -263,11 +263,11 @@ wheels = [
263
263
 
264
264
  [[package]]
265
265
  name = "certifi"
266
- version = "2026.5.20"
266
+ version = "2026.10.19"
267
267
  source = { registry = "https://pypi.org/simple" }
268
- sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" }
268
+ sdist = { url = "https://files.pythonhosted.org/packages/a6/bd/1436c50cc46699de0230fbaacc1d1de7bfec413176099949e9d5112e88f2/certifi-2026.10.19.tar.gz", hash = "sha256:035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae", size = 137598, upload-time = "2026-10-20T02:24:16.604Z" }
269
269
  wheels = [
270
- { url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" },
270
+ { url = "https://files.pythonhosted.org/packages/c4/51/29046e48f693c54e5b7412216d447a1d8362c9653148d98c02cdf65fa733/certifi-2026.10.19-py3-none-any.whl", hash = "sha256:42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b", size = 136464, upload-time = "2026-10-20T02:24:15.072Z" },
271
271
  ]
272
272
 
273
273
  [[package]]
@@ -1111,6 +1111,7 @@ name = "ipor-fusion"
1111
1111
  version = "3.16.0"
1112
1112
  source = { editable = "." }
1113
1113
  dependencies = [
1114
+ { name = "certifi" },
1114
1115
  { name = "eth-abi" },
1115
1116
  { name = "eth-account" },
1116
1117
  { name = "eth-typing" },
@@ -1145,6 +1146,7 @@ dev = [
1145
1146
 
1146
1147
  [package.metadata]
1147
1148
  requires-dist = [
1149
+ { name = "certifi", specifier = ">=2026.10.19" },
1148
1150
  { name = "click", marker = "extra == 'cli'", specifier = ">=8.0,<9" },
1149
1151
  { name = "click", marker = "extra == 'mcp'", specifier = ">=8.0,<9" },
1150
1152
  { name = "eth-abi", specifier = ">=5.1.0,<6" },