ipor-fusion 4.1.0.dev14__tar.gz → 4.1.0.dev35__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 (361) hide show
  1. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/AGENTS.md +2 -1
  2. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/MIGRATION_4.md +4 -1
  3. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/PKG-INFO +2 -2
  4. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/README.md +1 -1
  5. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_credit_market_base.py +9 -10
  6. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/advanced_euler_v2_looping_arbitrum.py +12 -11
  7. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +19 -22
  8. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/external_state_margin_leg_base.py +11 -10
  9. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/hypercore_vault_official_deployment_hyperevm.py +21 -47
  10. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/simple_aave_v3_supply_base.py +7 -6
  11. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/pyproject.toml +1 -1
  12. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/skills/ipor-deploy-vault/SKILL.md +3 -2
  13. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/__init__.py +2 -0
  14. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/options.py +16 -20
  15. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fusion_factory.py +4 -3
  16. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/plasma_vault.py +2 -4
  17. ipor_fusion-4.1.0.dev35/src/ipor_fusion/fuses/hypercore_pre_hooks.py +89 -0
  18. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/quickstart.md +3 -2
  19. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/hypercore/__init__.py +8 -0
  20. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/server.py +20 -6
  21. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/types.py +25 -12
  22. ipor_fusion-4.1.0.dev35/tests/_addresses.py +17 -0
  23. ipor_fusion-4.1.0.dev35/tests/test_addresses_helper.py +20 -0
  24. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cache.py +1 -1
  25. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_helpers.py +15 -12
  26. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_hypercore_hyperevm.py +4 -15
  27. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fusion_instance.py +3 -0
  28. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_flow.py +9 -19
  29. ipor_fusion-4.1.0.dev35/tests/test_hypercore_pre_hooks.py +72 -0
  30. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_preflight.py +9 -0
  31. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_server.py +25 -4
  32. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_public_api.py +5 -0
  33. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_types_and_events.py +18 -4
  34. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.claude-plugin/marketplace.json +0 -0
  35. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.claude-plugin/plugin.json +0 -0
  36. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.env.example +0 -0
  37. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.gemini/settings.json +0 -0
  38. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.git-blame-ignore-revs +0 -0
  39. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/cd.yml +0 -0
  40. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/ci.yml +0 -0
  41. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/commit-lint.yml +0 -0
  42. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/notify-slack.yml +0 -0
  43. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/python-build.yml +0 -0
  44. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/python-publish.yml +0 -0
  45. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/release.yml +0 -0
  46. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.github/workflows/report-slack.yml +0 -0
  47. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.gitignore +0 -0
  48. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.mcp.json +0 -0
  49. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.pre-commit-config.yaml +0 -0
  50. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/.python-version +0 -0
  51. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CHANGELOG.md +0 -0
  52. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CLAUDE.md +0 -0
  53. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/CODEOWNERS +0 -0
  54. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/LICENSE +0 -0
  55. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/build.sh +0 -0
  56. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/CONTRIBUTING.md +0 -0
  57. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/examples/README.md +0 -0
  58. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/pytest.ini +0 -0
  59. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/scripts/commit-check.sh +0 -0
  60. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/scripts/fusion_error_signatures.py +0 -0
  61. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/about.py +0 -0
  62. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cache.py +0 -0
  63. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/chains.py +0 -0
  64. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/__init__.py +0 -0
  65. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/address_cmd.py +0 -0
  66. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  67. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/config_cmd.py +0 -0
  68. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/config_store.py +0 -0
  69. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/main.py +0 -0
  70. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/market_cmd.py +0 -0
  71. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  72. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
  73. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  74. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_health.py +0 -0
  75. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  76. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  77. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  78. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/config/__init__.py +0 -0
  79. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/config/roles.py +0 -0
  80. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/__init__.py +0 -0
  81. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/access.py +0 -0
  82. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/address.py +0 -0
  83. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/context.py +0 -0
  84. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/context_manager.py +0 -0
  85. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/contract.py +0 -0
  86. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/erc20.py +0 -0
  87. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/external_state_executor.py +0 -0
  88. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fee_manager.py +0 -0
  89. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse.py +0 -0
  90. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse_action.py +0 -0
  91. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/fuse_decoding.py +0 -0
  92. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/logs.py +0 -0
  93. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/multicall.py +0 -0
  94. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/oracle.py +0 -0
  95. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/rewards_manager.py +0 -0
  96. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/simulation.py +0 -0
  97. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/simulation_result.py +0 -0
  98. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  99. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/__init__.py +0 -0
  100. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  101. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  102. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  103. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  104. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  105. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  106. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  107. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  108. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  109. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/contracts.py +0 -0
  110. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/discovery.py +0 -0
  111. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/errors.py +0 -0
  112. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  113. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  114. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  115. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  116. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/lane.py +0 -0
  117. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/logs.py +0 -0
  118. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/messages.py +0 -0
  119. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/simulation.py +0 -0
  120. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  121. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  122. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  123. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  124. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  125. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/crosschain/transport.py +0 -0
  126. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/dependency_graph.py +0 -0
  127. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/entry_cli.py +0 -0
  128. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/entry_mcp.py +0 -0
  129. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/errors.py +0 -0
  130. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/explorer.py +0 -0
  131. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/field_docs.py +0 -0
  132. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/__init__.py +0 -0
  133. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  134. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/async_action.py +0 -0
  135. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/base.py +0 -0
  136. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  137. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/erc4626.py +0 -0
  138. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  139. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/events.py +0 -0
  140. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/external_state.py +0 -0
  141. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  142. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  143. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  144. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/hypercore.py +0 -0
  145. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  146. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/merkl.py +0 -0
  147. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/morpho.py +0 -0
  148. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  149. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  150. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fuses/universal.py +0 -0
  151. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/fusion_errors.py +0 -0
  152. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/__init__.py +0 -0
  153. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/architecture.md +0 -0
  154. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/glossary.md +0 -0
  155. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/guide/invariants.md +0 -0
  156. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/market_ids.py +0 -0
  157. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/market_info.py +0 -0
  158. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/__init__.py +0 -0
  159. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/guide.py +0 -0
  160. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/mcp/models.py +0 -0
  161. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/morpho_api.py +0 -0
  162. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/preflight.py +0 -0
  163. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/py.typed +0 -0
  164. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/__init__.py +0 -0
  165. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/aave_v3.py +0 -0
  166. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/aave_v4.py +0 -0
  167. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/compound_v3.py +0 -0
  168. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/euler_v2.py +0 -0
  169. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/hypercore.py +0 -0
  170. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  171. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/lending_health.py +0 -0
  172. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/morpho.py +0 -0
  173. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  174. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  175. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  176. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/position_manager.py +0 -0
  177. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  178. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  179. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/readers/unpriceable.py +0 -0
  180. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/registry.py +0 -0
  181. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/substrates.py +0 -0
  182. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/validation.py +0 -0
  183. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_data.py +0 -0
  184. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_erc20.py +0 -0
  185. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_info.py +0 -0
  186. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_managers.py +0 -0
  187. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_positions.py +0 -0
  188. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/src/ipor_fusion/vault_reads.py +0 -0
  189. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/UniswapV3UniversalRouter.py +0 -0
  190. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain.py +0 -0
  191. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain_lifecycle.py +0 -0
  192. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_crosschain_recovery.py +0 -0
  193. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_euler_v2.py +0 -0
  194. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_event_args.py +0 -0
  195. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_fake_rpc.py +0 -0
  196. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_foundry.py +0 -0
  197. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_golden.py +0 -0
  198. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_guide.py +0 -0
  199. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_hypercore_model.py +0 -0
  200. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_hypercore_shadow.py +0 -0
  201. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_live.py +0 -0
  202. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_multicall.py +0 -0
  203. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_oracle_mapping_fake.py +0 -0
  204. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_simulate.py +0 -0
  205. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/_validation.py +0 -0
  206. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/addresses.py +0 -0
  207. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/conftest.py +0 -0
  208. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/constants.py +0 -0
  209. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  210. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_market55.json +0 -0
  211. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/hypercore_official.json +0 -0
  212. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  213. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  214. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  215. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  216. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  217. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  218. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  219. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  220. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  221. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  222. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  223. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  224. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  225. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  226. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  227. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  228. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/simulate_v1_request.json +0 -0
  229. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.json +0 -0
  230. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  231. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  232. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  233. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  234. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  235. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  236. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  237. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  238. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.json +0 -0
  239. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  240. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/full.txt +0 -0
  241. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.json +0 -0
  242. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  243. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  244. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_about.py +0 -0
  245. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_access_manager.py +0 -0
  246. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_chains.py +0 -0
  247. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_address.py +0 -0
  248. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_changelog.py +0 -0
  249. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_commands.py +0 -0
  250. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_config_store.py +0 -0
  251. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_hypercore.py +0 -0
  252. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_lending_health.py +0 -0
  253. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_market_golden.py +0 -0
  254. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_market_morpho_blue.py +0 -0
  255. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_mcp_parity.py +0 -0
  256. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_oracle_mapping.py +0 -0
  257. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_oracle_mapping_golden.py +0 -0
  258. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_pending_requests_scan.py +0 -0
  259. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_preflight.py +0 -0
  260. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_role_accounts.py +0 -0
  261. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_info_golden.py +0 -0
  262. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_predates_getters.py +0 -0
  263. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_cli_vault_validate.py +0 -0
  264. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_contract_call.py +0 -0
  265. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_contract_encoder.py +0 -0
  266. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_events.py +0 -0
  267. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_indexer.py +0 -0
  268. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_ccip_quote.py +0 -0
  269. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_chainlink.py +0 -0
  270. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_contracts.py +0 -0
  271. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_encoding.py +0 -0
  272. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_errors.py +0 -0
  273. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_lane.py +0 -0
  274. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_layering.py +0 -0
  275. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_crosschain_transport.py +0 -0
  276. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_docs_typing.py +0 -0
  277. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_erc20.py +0 -0
  278. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_error_hierarchy.py +0 -0
  279. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_crosschain.py +0 -0
  280. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  281. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_examples_vaults.py +0 -0
  282. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_explorer.py +0 -0
  283. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_external_state_events.py +0 -0
  284. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_external_state_executor.py +0 -0
  285. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fee_manager.py +0 -0
  286. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fuse_decoding.py +0 -0
  287. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fuse_encoding.py +0 -0
  288. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_fusion_errors.py +0 -0
  289. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_governance_wrappers.py +0 -0
  290. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_guide.py +0 -0
  291. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_deployment.py +0 -0
  292. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_events.py +0 -0
  293. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_live.py +0 -0
  294. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_outcome.py +0 -0
  295. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_readers.py +0 -0
  296. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_hypercore_simulation.py +0 -0
  297. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_logs.py +0 -0
  298. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_address.py +0 -0
  299. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_hypercore.py +0 -0
  300. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_models.py +0 -0
  301. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_mcp_vault_validate.py +0 -0
  302. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_multicall.py +0 -0
  303. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_oracle.py +0 -0
  304. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_oracle_mapping.py +0 -0
  305. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_plasma_vault.py +0 -0
  306. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_preflight.py +0 -0
  307. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_public_type_reachability.py +0 -0
  308. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_reader_encoding.py +0 -0
  309. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_registry.py +0 -0
  310. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_revert_decoding.py +0 -0
  311. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_rewards_manager.py +0 -0
  312. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_roles.py +0 -0
  313. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_sdk_layering.py +0 -0
  314. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  315. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  316. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  317. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  318. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  319. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  320. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  321. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  322. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  323. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_arbitrum.py +0 -0
  324. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_base.py +0 -0
  325. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_crosschain.py +0 -0
  326. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_examples_hyperevm.py +0 -0
  327. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_external_state_executor_base.py +0 -0
  328. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  329. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  330. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  331. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_morpho_blue.py +0 -0
  332. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v3.py +0 -0
  333. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  334. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  335. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  336. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  337. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_preflight_base.py +0 -0
  338. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_readers_integration.py +0 -0
  339. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_release_funds.py +0 -0
  340. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_swap_on_base.py +0 -0
  341. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_timelock_base.py +0 -0
  342. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  343. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulation_errors.py +0 -0
  344. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_simulation_observation.py +0 -0
  345. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_solidity_compiler.py +0 -0
  346. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_solidity_mirrors.py +0 -0
  347. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_substrates.py +0 -0
  348. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_unpriceable_tokens.py +0 -0
  349. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_validation.py +0 -0
  350. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_data_block.py +0 -0
  351. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_dep_graph.py +0 -0
  352. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_fetched_golden.py +0 -0
  353. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_onchain_base.py +0 -0
  354. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  355. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  356. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_vault_simulator_blocks.py +0 -0
  357. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_web3_context.py +0 -0
  358. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/test_withdraw_manager.py +0 -0
  359. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/typed_client/consumer.py +0 -0
  360. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/tests/typed_client/rejected.py +0 -0
  361. {ipor_fusion-4.1.0.dev14 → ipor_fusion-4.1.0.dev35}/uv.lock +0 -0
@@ -281,7 +281,8 @@ checkout's default profile), the pending reader included.
281
281
  `hypercore_event_decoding.py` (the ExternalState and HyperCore event specs, classes
282
282
  and decoders; internal modules, the ExternalState names are exported from
283
283
  `ipor_fusion.fuses`, the HyperCore ones from `ipor_fusion.hypercore`), `hypercore.py`
284
- (the HyperCore fuses, market 55);
284
+ (the HyperCore fuses, market 55), `hypercore_pre_hooks.py` (the `PlasmaVault` call
285
+ that wires their pre-hooks);
285
286
  `base.py` re-exports the `core/fuse.py` base and validators,
286
287
  `FuseAction` and `ZERO_ADDRESS` (from `types`). A fuse is a value: equality and
287
288
  hash cover its class and every attribute it stores
@@ -761,7 +761,7 @@ label values; they do not validate byte widths or address spelling.
761
761
  | `RoleId` | a `Roles` member (accepted as is), or `RoleId(n)`; `Roles.resolve(name)` returns one |
762
762
  | `Decimals`, `Period`, `Amount`, `Shares`, ... | `Decimals(8)`, `Period(0)`, `Amount(n)`, `Shares(n)` |
763
763
  | `Wad` | `Wad(6 * 10**17)` (60%): an 18-decimal fraction, `10**18` is 100% |
764
- | `ChecksumAddress` | `Web3.to_checksum_address(value)` |
764
+ | `ChecksumAddress` | `Web3.to_checksum_address(value)`, or from 4.1 `parse_checksum_address(value)`, which also rejects a wrong EIP-55 checksum |
765
765
  | `HexAddress` | any `ChecksumAddress`, or `parse_hex_address(value)` (20 bytes or `0x`/`0X`-prefixed hex in any case → lowercase `0x` form) |
766
766
  | `MorphoBlueMarketId` | `parse_morpho_market_id(value)`: 32 bytes or hex in any spelling, always `0x` + 64 lowercase digits |
767
767
  | `TxHash` | `parse_tx_hash(value)` (32 bytes or `0x`/`0X`-prefixed hex in any case) |
@@ -775,6 +775,9 @@ The address and hash parsers (`parse_hex_address`, `parse_tx_hash`,
775
775
  `parse_plasma_vault_address`, `parse_fuse_address`, `parse_access_manager_address`)
776
776
  validate strictly: a string needs exactly one `0x`/`0X` prefix and the exact number of
777
777
  hex digits, with no surrounding whitespace; anything else raises `ValueError`.
778
+ From 4.1 on, the checksumming ones (`parse_checksum_address` and the three role
779
+ parsers) also reject a mixed-case address whose EIP-55 checksum is wrong; an
780
+ all-lowercase or all-uppercase address carries no checksum and still parses.
778
781
  Normalize user input first (see [Start here](#start-here)).
779
782
  `parse_morpho_market_id` still accepts hex without `0x`.
780
783
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.1.0.dev14
3
+ Version: 4.1.0.dev35
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
@@ -543,7 +543,7 @@ the pilot executors and factories). Pin an exact version if you depend on them.
543
543
  | `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 |
544
544
  | `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse events and the pending library's `HyperCoreActionEnqueued` / `HyperCoreActionSettled`, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
545
545
  | Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
546
- | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
546
+ | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state`, the event decoders and `HyperCorePreHookWiring` (the capital-flow and pending-action pre-hooks on their selectors, `HYPERCORE_CAPITAL_FLOW_SELECTORS` / `HYPERCORE_PENDING_ACTION_SELECTORS`) |
547
547
 
548
548
  The crosschain API supports only the contracts of the 2026-10-21 release; earlier
549
549
  deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
@@ -494,7 +494,7 @@ the pilot executors and factories). Pin an exact version if you depend on them.
494
494
  | `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 |
495
495
  | `decode_hypercore_event`, `hypercore_events` | The HyperCore fuse events and the pending library's `HyperCoreActionEnqueued` / `HyperCoreActionSettled`, decoded by topic with their raw log identity under the same input contract as `decode_external_state_event`; a malformed listed log raises `HyperCoreEventDecodeError` |
496
496
  | Crosschain fuses (market 54): `StargateCrosschainSupplyFuse`, `StargateCrosschainCommandFuse`, `CcipCrosschainSupplyFuse`, `CcipCrosschainCommandFuse`, `CrosschainClaimFuse`; transport-agnostic bases `CrosschainSupplyFuse` / `CrosschainCommandFuse` with `StargateSendParams` / `CcipSendParams`, plus `Command`, `CrosschainSubstrateLib`, `OptionsBuilder` | `ipor_fusion.crosschain` |
497
- | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state` and the event decoders |
497
+ | HyperCore fuses (market 55): `HyperCoreDepositFuse`, `HyperCoreMarginFuse`, `HyperCoreSendFuse`, `HyperCoreOrderFuse`, `HyperCoreCancelFuse`, `HyperCoreBuilderFeeFuse`, `HyperCoreSubstrates` | `ipor_fusion.hypercore`, with `HyperCoreReader`, `read_hypercore_vault_state`, the event decoders and `HyperCorePreHookWiring` (the capital-flow and pending-action pre-hooks on their selectors, `HYPERCORE_CAPITAL_FLOW_SELECTORS` / `HYPERCORE_PENDING_ACTION_SELECTORS`) |
498
498
 
499
499
  The crosschain API supports only the contracts of the 2026-10-21 release; earlier
500
500
  deployments are unreadable (`MIGRATION_4.md`). `open_lane` and `discover_deployment`
@@ -62,6 +62,7 @@ from ipor_fusion import (
62
62
  VaultSimulator,
63
63
  Web3Context,
64
64
  is_simulate_v1_supported,
65
+ parse_checksum_address,
65
66
  parse_fuse_address,
66
67
  )
67
68
  from ipor_fusion.fuses import (
@@ -87,7 +88,7 @@ BASE_CHAIN_ID = ChainId(8453)
87
88
  EULER_MARKET = IporFusionMarkets.EULER_V2
88
89
 
89
90
  # IporFusionFactoryProxy on Base. Its clone(...) takes the six args in clone_args().
90
- BASE_FUSION_FACTORY = Web3.to_checksum_address(
91
+ BASE_FUSION_FACTORY = parse_checksum_address(
91
92
  "0x1455717668fA96534f675856347A973fA907e922"
92
93
  )
93
94
 
@@ -116,20 +117,18 @@ EULER_BALANCE_FUSE = parse_fuse_address("0xF8A6AA09bB55f2319113b0DA88883F392e66A
116
117
  # so they are not in the ipor-abi registry -- they are a live cbETH/WETH pair
117
118
  # whose LTV allows the borrow below. The RPC-gated test asserts each eVault's
118
119
  # IEVault.asset() equals the expected underlying, which is their provenance check.
119
- EVAULT_CBETH = Web3.to_checksum_address("0x358f25F82644eaBb441d0df4AF8746614fb9ea49")
120
- EVAULT_WETH = Web3.to_checksum_address("0x859160DB5841E5cfB8D3f144C6b3381A85A4b410")
120
+ EVAULT_CBETH = parse_checksum_address("0x358f25F82644eaBb441d0df4AF8746614fb9ea49")
121
+ EVAULT_WETH = parse_checksum_address("0x859160DB5841E5cfB8D3f144C6b3381A85A4b410")
121
122
 
122
123
  # Underlying assets of those eVaults (registry names "cbETH" / "wETH").
123
- BASE_CBETH = Web3.to_checksum_address("0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22")
124
- BASE_WETH = Web3.to_checksum_address("0x4200000000000000000000000000000000000006")
124
+ BASE_CBETH = parse_checksum_address("0x2Ae3F1Ec7F1F5012CFEab0185bfc7aa3cf0DEc22")
125
+ BASE_WETH = parse_checksum_address("0x4200000000000000000000000000000000000006")
125
126
 
126
127
  # A Base address holding ample cbETH, used to fund the vault's collateral via an
127
128
  # impersonated transfer inside the simulation. This is the Morpho Blue core
128
129
  # contract (registry name "Morpho") -- a large, unrelated holder, so funding does
129
130
  # not perturb the Euler markets the strategy uses.
130
- BASE_CBETH_WHALE = Web3.to_checksum_address(
131
- "0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"
132
- )
131
+ BASE_CBETH_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
133
132
 
134
133
  # ── Simulation parameters (safe to adjust) ───────────────────────────────────
135
134
  #
@@ -152,10 +151,10 @@ BASE_CBETH_WHALE = Web3.to_checksum_address(
152
151
  # focuses on the credit lifecycle rather than the deposit -> shares path.)
153
152
 
154
153
  # Governance/atomist. Any address; here it happens to be a random EOA.
155
- OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
154
+ OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
156
155
 
157
156
  # The alpha operator. Anvil account #0, a well-known test address.
158
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
157
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
159
158
 
160
159
  # One owner address controls 256 Euler sub-accounts; the vault's EVC account for
161
160
  # this position is `plasma_vault XOR SUB_ACCOUNT`. Using a non-zero sub-account
@@ -47,6 +47,7 @@ from ipor_fusion import (
47
47
  VaultSimulator,
48
48
  Web3Context,
49
49
  is_simulate_v1_supported,
50
+ parse_checksum_address,
50
51
  parse_fuse_address,
51
52
  )
52
53
  from ipor_fusion.fuses import (
@@ -76,7 +77,7 @@ EULER_MARKET = IporFusionMarkets.EULER_V2
76
77
  SWAPPER_MARKET = IporFusionMarkets.UNIVERSAL_TOKEN_SWAPPER_V2
77
78
  MORPHO_FLASH_MARKET = IporFusionMarkets.MORPHO_FLASH_LOAN
78
79
 
79
- ARBITRUM_FUSION_FACTORY = Web3.to_checksum_address(
80
+ ARBITRUM_FUSION_FACTORY = parse_checksum_address(
80
81
  "0x134fCAce7a2C7Ef3dF2479B62f03ddabAEa922d5"
81
82
  )
82
83
  EULER_SUPPLY_FUSE = parse_fuse_address("0x920f6c81666877490A8D6dcFEFd85d151Ef04B7d")
@@ -96,34 +97,34 @@ UNIVERSAL_SWAPPER_FUSE_V2 = parse_fuse_address(
96
97
  UNIVERSAL_SWAPPER_BALANCE_FUSE_V2 = parse_fuse_address(
97
98
  "0x69199E8360b3Baa536Cda2bd71dFFb30F79fBeF7"
98
99
  )
99
- MORPHO_CALLBACK_HANDLER = Web3.to_checksum_address(
100
+ MORPHO_CALLBACK_HANDLER = parse_checksum_address(
100
101
  "0x62E0A527fa7990183C4225f4565B2BfC925CD46e"
101
102
  )
102
- MORPHO = Web3.to_checksum_address("0x6c247b1F6182318877311737BaC0844bAa518F5e")
103
+ MORPHO = parse_checksum_address("0x6c247b1F6182318877311737BaC0844bAa518F5e")
103
104
 
104
105
  # Euler eVaults come from Euler's official Arbitrum Cluster deployment manifest.
105
106
  # The RPC-gated test also checks each eVault's ``asset()`` at PINNED_BLOCK.
106
- EVAULT_USDC = Web3.to_checksum_address("0x0a1eCC5Fe8C9be3C809844fcBe615B46A869b899")
107
- EVAULT_WBTC = Web3.to_checksum_address("0x889E1c458B2469b70aCcdfb5B59726dC1668896C")
107
+ EVAULT_USDC = parse_checksum_address("0x0a1eCC5Fe8C9be3C809844fcBe615B46A869b899")
108
+ EVAULT_WBTC = parse_checksum_address("0x889E1c458B2469b70aCcdfb5B59726dC1668896C")
108
109
 
109
- ARBITRUM_USDC = Web3.to_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
110
- ARBITRUM_WBTC = Web3.to_checksum_address("0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f")
110
+ ARBITRUM_USDC = parse_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
111
+ ARBITRUM_WBTC = parse_checksum_address("0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f")
111
112
 
112
113
  # Official Uniswap Universal Router deployment on Arbitrum. The 500-fee pool is
113
114
  # verified on-chain in the RPC-gated test and is the deepest USDC/WBTC V3 pool at
114
115
  # the pinned block.
115
- UNISWAP_UNIVERSAL_ROUTER = Web3.to_checksum_address(
116
+ UNISWAP_UNIVERSAL_ROUTER = parse_checksum_address(
116
117
  "0x5E325eDA8064b456f4781070C0738d849c824258"
117
118
  )
118
119
  UNISWAP_POOL_FEE = 500
119
- UNISWAP_USDC_WBTC_POOL = Web3.to_checksum_address(
120
+ UNISWAP_USDC_WBTC_POOL = parse_checksum_address(
120
121
  "0x0e4831319a50228b9e450861297ab92dee15b44f"
121
122
  )
122
123
 
123
124
  # ── Simulation parameters (safe to adjust) ───────────────────────────────────
124
125
 
125
- OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
126
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
126
+ OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
127
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
127
128
  SUB_ACCOUNT = 0x01
128
129
 
129
130
  INITIAL_WBTC = Amount(10_000_000) # 0.10 WBTC, the unlevered equity
@@ -113,6 +113,7 @@ from ipor_fusion import (
113
113
  Web3Context,
114
114
  erc20_balance_slot,
115
115
  is_simulate_v1_supported,
116
+ parse_checksum_address,
116
117
  parse_fuse_address,
117
118
  )
118
119
  from ipor_fusion.crosschain import (
@@ -151,10 +152,10 @@ ARBITRUM_CHAIN_ID = ChainId(42161)
151
152
  HYPEREVM_CHAIN_ID = ChainId(999)
152
153
  ARBITRUM_CCIP_SELECTOR = CcipChainSelector(4949039107694359620)
153
154
  HYPEREVM_CCIP_SELECTOR = CcipChainSelector(2442541497099098535)
154
- ARBITRUM_CCIP_ROUTER = Web3.to_checksum_address(
155
+ ARBITRUM_CCIP_ROUTER = parse_checksum_address(
155
156
  "0x141fa059441E0ca23ce184B6A78bafD2A517DdE8"
156
157
  )
157
- HYPEREVM_CCIP_ROUTER = Web3.to_checksum_address(
158
+ HYPEREVM_CCIP_ROUTER = parse_checksum_address(
158
159
  "0x13b3332b66389B1467CA6eBd6fa79775CCeF65ec"
159
160
  )
160
161
 
@@ -162,17 +163,17 @@ HYPEREVM_CCIP_ROUTER = Web3.to_checksum_address(
162
163
  # (developers.circle.com -> stablecoins -> USDC contract addresses). The USDC
163
164
  # CCIP lane between them is a CCTP burn-and-mint lane, so the asset arrives as
164
165
  # the same native token on the other side.
165
- ARBITRUM_USDC = Web3.to_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
166
- HYPEREVM_USDC = Web3.to_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
166
+ ARBITRUM_USDC = parse_checksum_address("0xaf88d065e77c8cC2239327C5EDb3A432268e5831")
167
+ HYPEREVM_USDC = parse_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
167
168
  USDC_DECIMALS = Decimals(6)
168
169
 
169
170
  # Chainlink USDC/USD feed proxies (data.chain.link -> feeds -> arbitrum ->
170
171
  # mainnet -> usdc-usd, and hyperliquid -> hyperliquid -> usdc-usd; the standard
171
172
  # feeds, not SVR). Each vault's price manager prices USDC from its chain's feed.
172
- ARBITRUM_USDC_USD_FEED = Web3.to_checksum_address(
173
+ ARBITRUM_USDC_USD_FEED = parse_checksum_address(
173
174
  "0x50834F3163758fcC1Df9973b6e91f0F0F0434aD3"
174
175
  )
175
- HYPEREVM_USDC_USD_FEED = Web3.to_checksum_address(
176
+ HYPEREVM_USDC_USD_FEED = parse_checksum_address(
176
177
  "0xA0Adc43ce7AfE3EE7d7eac3C994E178D0620223B"
177
178
  )
178
179
 
@@ -180,10 +181,10 @@ HYPEREVM_USDC_USD_FEED = Web3.to_checksum_address(
180
181
  # mainnet/mainnet-arbitrum-fusion/addresses.json and
181
182
  # mainnet/mainnet-hyperevm-fusion/addresses.json. Their clone(...) creates the
182
183
  # hub and the spoke vault.
183
- ARBITRUM_FUSION_FACTORY = Web3.to_checksum_address(
184
+ ARBITRUM_FUSION_FACTORY = parse_checksum_address(
184
185
  "0x134fCAce7a2C7Ef3dF2479B62f03ddabAEa922d5"
185
186
  )
186
- HYPEREVM_FUSION_FACTORY = Web3.to_checksum_address(
187
+ HYPEREVM_FUSION_FACTORY = parse_checksum_address(
187
188
  "0x6bBc827F34b4e862d15215ABd4AC0E3886181665"
188
189
  )
189
190
 
@@ -195,7 +196,7 @@ HYPEREVM_FUSION_FACTORY = Web3.to_checksum_address(
195
196
  RELEASE_COMMIT = "10f0f8e4031980b6f130d4f6460c6f8edfbcab32"
196
197
  # CcipCrosschainFactory: creates executors on the hub and dispatchers on the
197
198
  # spoke, and carries the factory-to-factory deployment ticket.
198
- CCIP_FACTORY = Web3.to_checksum_address("0xAd84580810A4e498F5F13Ad8506F73782FB472FA")
199
+ CCIP_FACTORY = parse_checksum_address("0xAd84580810A4e498F5F13Ad8506F73782FB472FA")
199
200
  # CcipCrosschainSupplyFuse, CcipCrosschainCommandFuse, CrosschainClaimFuse and
200
201
  # CrosschainBalanceFuse, all bound to the CROSSCHAIN market (54).
201
202
  CCIP_SUPPLY_FUSE = parse_fuse_address("0x00a20FD711083CcE9C9c4292762aFf79f78C48eb")
@@ -207,13 +208,13 @@ CROSSCHAIN_BALANCE_FUSE = parse_fuse_address(
207
208
  # CrosschainNavValidationPreHook: closes the vault's share-price-sensitive entry
208
209
  # points while any of its executors fails its NAV check (a stale attestation,
209
210
  # a blocked chain, a stale transfer).
210
- CROSSCHAIN_NAV_PRE_HOOK = Web3.to_checksum_address(
211
+ CROSSCHAIN_NAV_PRE_HOOK = parse_checksum_address(
211
212
  "0xA17c7A5Ed994aA5FE99C22B37DeCBCbfb32FaFe3"
212
213
  )
213
214
  # The libraries the executor and the dispatcher link (source path, name,
214
215
  # address), in the order Foundry's ``--libraries`` takes them.
215
216
  RELEASE_LIBRARIES: tuple[tuple[str, str, ChecksumAddress], ...] = tuple(
216
- (source, name, Web3.to_checksum_address(address))
217
+ (source, name, parse_checksum_address(address))
217
218
  for source, name, address in (
218
219
  (
219
220
  "contracts/crosschain/ccip/lib/CcipRouteLib.sol",
@@ -277,7 +278,7 @@ DISPATCHER_CREATION_CODE_HASH = bytes.fromhex(
277
278
  # The factory's owner on both chains, read from CcipCrosschainFactory.owner()
278
279
  # (a Safe multisig). Only it configures the factory and allows executor
279
280
  # creators; the example checks the read against this constant.
280
- FACTORY_OWNER = Web3.to_checksum_address("0xA74376157E78053275fdae4A6849B5C16F41A0B9")
281
+ FACTORY_OWNER = parse_checksum_address("0xA74376157E78053275fdae4A6849B5C16F41A0B9")
281
282
 
282
283
  # ``IporFusionMarkets.CROSSCHAIN``: the market the crosschain fuses are bound to.
283
284
  CROSSCHAIN_MARKET = IporFusionMarkets.CROSSCHAIN
@@ -303,17 +304,13 @@ CROSSCHAIN_MARKET = IporFusionMarkets.CROSSCHAIN
303
304
  # RESCUE_GUARDIAN -- can veto the executor's timelocked rescue actions,
304
305
  # nothing else; the executor refuses it equal to the rescue
305
306
  # admin (VAULT_OWNER).
306
- VAULT_OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
307
+ VAULT_OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
307
308
  # Anvil accounts #0 to #4, well-known test addresses.
308
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
309
- DEPOSITOR = Web3.to_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
310
- BALANCE_PROPOSER = Web3.to_checksum_address(
311
- "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC"
312
- )
313
- BALANCE_APPROVER = Web3.to_checksum_address(
314
- "0x90F79bf6EB2c4f870365E785982E1f101E93b906"
315
- )
316
- RESCUE_GUARDIAN = Web3.to_checksum_address("0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65")
309
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
310
+ DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
311
+ BALANCE_PROPOSER = parse_checksum_address("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC")
312
+ BALANCE_APPROVER = parse_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b906")
313
+ RESCUE_GUARDIAN = parse_checksum_address("0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65")
317
314
 
318
315
  # ── Adjustable simulation parameters ─────────────────────────────────────────
319
316
  # Pinned after the released contracts were deployed, at the same timestamp on
@@ -99,6 +99,7 @@ from ipor_fusion import (
99
99
  WithdrawManager,
100
100
  WithdrawRequestInfo,
101
101
  is_simulate_v1_supported,
102
+ parse_checksum_address,
102
103
  parse_fuse_address,
103
104
  )
104
105
  from ipor_fusion.fuses import ExternalStateOperationFuse
@@ -116,7 +117,7 @@ BASE_CHAIN_ID = ChainId(8453)
116
117
 
117
118
  # IporFusionFactoryProxy on Base. Its clone(...) takes the six arguments
118
119
  # assembled in clone_args() below.
119
- BASE_FUSION_FACTORY = Web3.to_checksum_address(
120
+ BASE_FUSION_FACTORY = parse_checksum_address(
120
121
  "0x1455717668fA96534f675856347A973fA907e922"
121
122
  )
122
123
 
@@ -125,7 +126,7 @@ BASE_FUSION_FACTORY = Web3.to_checksum_address(
125
126
  # asset parked at the venue -- perp venues margin in USDC, and a venue that
126
127
  # credits by sender needs the executor itself to send it, so a second asset plus
127
128
  # a swap would only add a market this example does not need.
128
- BASE_USDC = Web3.to_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
129
+ BASE_USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
129
130
 
130
131
  # External-state market (IporFusionMarkets.EXTERNAL_STATE).
131
132
  EXTERNAL_STATE_MARKET = IporFusionMarkets.EXTERNAL_STATE
@@ -172,17 +173,17 @@ BASE_EXTERNAL_STATE_BALANCE_FUSE = parse_fuse_address(
172
173
  # two addresses driven by one process buy nothing.
173
174
 
174
175
  # Governance/atomist. Any address; here it happens to be a random EOA.
175
- OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
176
+ OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
176
177
 
177
178
  # The alpha operator. Anvil account #0, a well-known test address.
178
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
179
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
179
180
 
180
181
  # The depositor -- the end user putting funds in. Anvil account #1.
181
- DEPOSITOR = Web3.to_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
182
+ DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
182
183
 
183
184
  # The two custodians. Anvil accounts #2 and #3.
184
- CUSTODIAN_A = Web3.to_checksum_address("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC")
185
- CUSTODIAN_B = Web3.to_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b906")
185
+ CUSTODIAN_A = parse_checksum_address("0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC")
186
+ CUSTODIAN_B = parse_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b906")
186
187
 
187
188
  # SIMULATION ONLY (placeholder addresses). Two distinct things, easy to conflate.
188
189
  #
@@ -204,10 +205,10 @@ CUSTODIAN_B = Web3.to_checksum_address("0x90F79bf6EB2c4f870365E785982E1f101E93b9
204
205
  # not reach. Pasting that address here would give it borrowed provenance: on Base
205
206
  # it is an unrelated account, and a reader who copied it would send funds
206
207
  # nowhere.
207
- VENUE_DEPOSIT_ADDRESS = Web3.to_checksum_address(
208
+ VENUE_DEPOSIT_ADDRESS = parse_checksum_address(
208
209
  "0x000000000000000000000000000000000000BEEF"
209
210
  )
210
- VENUE_BALANCE_ACCOUNT = Web3.to_checksum_address(
211
+ VENUE_BALANCE_ACCOUNT = parse_checksum_address(
211
212
  "0x000000000000000000000000000000000000CAFE"
212
213
  )
213
214
 
@@ -215,7 +216,7 @@ VENUE_BALANCE_ACCOUNT = Web3.to_checksum_address(
215
216
  # impersonated transfer inside the simulation. Morpho Blue's core contract
216
217
  # (~150M USDC) -- a protocol this example never touches, so funding cannot
217
218
  # perturb the flow under test.
218
- BASE_USDC_WHALE = Web3.to_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
219
+ BASE_USDC_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
219
220
 
220
221
  # Pinned Base block, after both external-state fuses were deployed. Pinning makes
221
222
  # the simulation deterministic and immune to mainnet state drift. It requires an
@@ -96,6 +96,7 @@ from ipor_fusion import (
96
96
  decode_substrate,
97
97
  erc20_balance_slot,
98
98
  is_simulate_v1_supported,
99
+ parse_checksum_address,
99
100
  parse_fuse_address,
100
101
  )
101
102
  from ipor_fusion.hypercore import (
@@ -110,6 +111,7 @@ from ipor_fusion.hypercore import (
110
111
  HyperCorePendingReader,
111
112
  HyperCorePendingState,
112
113
  HyperCorePerpAssetInfo,
114
+ HyperCorePreHookWiring,
113
115
  HyperCoreReader,
114
116
  HyperCoreSendFuse,
115
117
  HyperCoreSubstrates,
@@ -138,7 +140,7 @@ log = logging.getLogger("hypercore_vault_official_deployment_hyperevm")
138
140
  HYPEREVM_CHAIN_ID = ChainId(999)
139
141
 
140
142
  # IporFusionFactoryProxy (implementation IporFusionFactoryImpl, factory version 10).
141
- FUSION_FACTORY = Web3.to_checksum_address("0x6bBc827F34b4e862d15215ABd4AC0E3886181665")
143
+ FUSION_FACTORY = parse_checksum_address("0x6bBc827F34b4e862d15215ABd4AC0E3886181665")
142
144
 
143
145
  # BurnRequestFeeFuseV2: the fuse every factory clone starts with.
144
146
  FACTORY_FEE_FUSE = parse_fuse_address("0xD62f398d36aeDE3992521EA9Fc501dEB418a50b4")
@@ -154,28 +156,28 @@ ORDER_FUSE = parse_fuse_address("0x96f97c088E9610A036a2738B004DF04Ee9Cf17a2")
154
156
  # HyperCoreBalanceFuse: values the vault's Core account for market 55.
155
157
  BALANCE_FUSE = parse_fuse_address("0xbEd25202529DCD2a05f7D8944B10779b6dbc6Fa6")
156
158
  # HyperCoreCapitalFlowPreHook and HyperCorePendingActionPreHook.
157
- CAPITAL_FLOW_PRE_HOOK = Web3.to_checksum_address(
159
+ CAPITAL_FLOW_PRE_HOOK = parse_checksum_address(
158
160
  "0xbA999E8b50bDC2672CcE13A1F896aaD7Dc5BE547"
159
161
  )
160
- PENDING_ACTION_PRE_HOOK = Web3.to_checksum_address(
162
+ PENDING_ACTION_PRE_HOOK = parse_checksum_address(
161
163
  "0xd240690cf7C41dDD75863c4b4a9358ea62B20c85"
162
164
  )
163
165
  # HyperCorePendingReader: the stateless helper the vault delegatecalls to report
164
166
  # its pending-action record. The SDK's default for chain 999 is this address.
165
- PENDING_READER = Web3.to_checksum_address("0x1EFFb12434f5fb59a636C54D8CBaC93b13DF1A9E")
167
+ PENDING_READER = parse_checksum_address("0x1EFFb12434f5fb59a636C54D8CBaC93b13DF1A9E")
166
168
 
167
169
  # IporFusionPriceFeedUSD: a constant 1 USD price (8 decimals). The global price
168
170
  # oracle middleware on HyperEVM has no USDC source, so the vault's own price
169
171
  # manager must name one. A constant peg keeps this example's NAV arithmetic
170
172
  # exact; a production vault picks its USDC feed in its oracle review (a market
171
173
  # USDC/USD feed prices a depeg, a constant does not).
172
- USD_PRICE_FEED = Web3.to_checksum_address("0x15794119c5D99Ed7997D1CE80DE8599e188547c5")
174
+ USD_PRICE_FEED = parse_checksum_address("0x15794119c5D99Ed7997D1CE80DE8599e188547c5")
173
175
 
174
176
  # Native Circle USDC on HyperEVM (6 decimals). Core token 0 is USDC; its
175
177
  # ``tokenInfo(0).evmContract`` is Circle's CoreDepositWallet, whose ``token()`` is
176
178
  # this ERC-20, so the SpotToken grant names this address, not the wallet
177
179
  # (contracts/fuses/hypercore/README.md in ipor-fusion).
178
- HYPEREVM_USDC = Web3.to_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
180
+ HYPEREVM_USDC = parse_checksum_address("0xb88339CB7199b77E23DB6E890353E22632Ba630f")
179
181
 
180
182
  # xyz is HIP-3 perp dex 1, and xyz:NVDA is its market 2: action asset
181
183
  # 100_000 + 1 * 10_000 + 2 in orders and grants, read index 10_002 for the
@@ -195,9 +197,9 @@ XYZ_NVDA_SZ_DECIMALS = 3
195
197
  # refresh balances, and DEPOSITOR is an end user. OWNER and ALPHA must never
196
198
  # share an address in production: a compromised alpha key would become
197
199
  # governance, and on a HyperCore vault governance can re-wire the pre-hooks.
198
- OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
199
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
200
- DEPOSITOR = Web3.to_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
200
+ OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
201
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
202
+ DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
201
203
 
202
204
  # Pinned HyperEVM block, after the official HyperCore contracts and the factory
203
205
  # upgrade. If your provider cannot serve state at this height, BUMP IT to a
@@ -234,22 +236,10 @@ MAX_ORDER_NOTIONAL_USD6 = 15_000_000
234
236
  SEND_CAP_WEI = 10_000_000_000 # 100 USDC
235
237
  NAV_JUMP_FLOOR_USD6 = 1_000_000 # 1 USD; the runbook sizes it per vault TVL
236
238
 
237
- # The six share-priced entry points and the two operator entry points of a
238
- # Plasma Vault: the HyperCore pre-hooks are wired per selector.
239
- CAPITAL_FLOW_SELECTORS = tuple(
240
- function_signature_to_4byte_selector(signature)
241
- for signature in (
242
- "deposit(uint256,address)",
243
- "depositWithPermit(uint256,address,uint256,uint8,bytes32,bytes32)",
244
- "mint(uint256,address)",
245
- "withdraw(uint256,address,address)",
246
- "redeem(uint256,address,address)",
247
- "redeemFromRequest(uint256,address,address)",
248
- )
249
- )
250
- PENDING_ACTION_SELECTORS = tuple(
251
- function_signature_to_4byte_selector(signature)
252
- for signature in ("execute((address,bytes)[])", "updateMarketsBalances(uint256[])")
239
+ # This deployment's two pre-hooks.
240
+ PRE_HOOKS = HyperCorePreHookWiring(
241
+ capital_flow_hook=CAPITAL_FLOW_PRE_HOOK,
242
+ pending_action_hook=PENDING_ACTION_PRE_HOOK,
253
243
  )
254
244
 
255
245
 
@@ -340,18 +330,6 @@ def market_substrates(vault: PlasmaVaultAddress) -> list[bytes]:
340
330
  ]
341
331
 
342
332
 
343
- def pre_hook_wiring() -> tuple[list[bytes], list[ChecksumAddress], list[list[bytes]]]:
344
- """``setPreHookImplementations`` arguments: the capital-flow hook on the six
345
- share-priced selectors, the pending-action hook on ``execute`` and
346
- ``updateMarketsBalances``; neither hook takes substrates. A selector appears
347
- once: a duplicate in one call silently keeps the last value."""
348
- selectors = [*CAPITAL_FLOW_SELECTORS, *PENDING_ACTION_SELECTORS]
349
- implementations = [CAPITAL_FLOW_PRE_HOOK] * len(CAPITAL_FLOW_SELECTORS) + [
350
- PENDING_ACTION_PRE_HOOK
351
- ] * len(PENDING_ACTION_SELECTORS)
352
- return selectors, implementations, [[] for _ in selectors]
353
-
354
-
355
333
  def core_to_evm_amount(spot_total_wei: int) -> int:
356
334
  """Core wei to bridge back: spot minus the fee reserve, rounded down to a
357
335
  multiple of 100 Core wei so the EVM amount is exact."""
@@ -675,9 +653,8 @@ def run_simulation(
675
653
 
676
654
  # 3. The pre-hooks. The deposit fuse and opening orders revert unless all
677
655
  # six share-priced selectors carry the capital-flow hook.
678
- selectors, implementations, hook_substrates = pre_hook_wiring()
679
656
  sim.add_call(
680
- vault.set_pre_hook_implementations(selectors, implementations, hook_substrates),
657
+ PRE_HOOKS.set_pre_hook_implementations(vault),
681
658
  from_=OWNER,
682
659
  label="set pre-hooks",
683
660
  gas=CALL_GAS,
@@ -686,8 +663,10 @@ def run_simulation(
686
663
 
687
664
  # The post-deployment checklist, read back from the wired vault.
688
665
  wired_hooks = [
689
- (selector, sim.observe(vault.get_pre_hook_implementation(selector)))
690
- for selector in selectors
666
+ (selector, expected, sim.observe(vault.get_pre_hook_implementation(selector)))
667
+ for selector, expected in zip(
668
+ PRE_HOOKS.selectors, PRE_HOOKS.implementations, strict=True
669
+ )
691
670
  ]
692
671
  vault_refresh_role = sim.observe(
693
672
  access_manager.has_role(Roles.UPDATE_MARKETS_BALANCES_ROLE, vault_address)
@@ -719,12 +698,7 @@ def run_simulation(
719
698
  result = sim.run()
720
699
  _assert_all_success(result)
721
700
 
722
- for selector, implementation in wired_hooks:
723
- expected = (
724
- CAPITAL_FLOW_PRE_HOOK
725
- if selector in CAPITAL_FLOW_SELECTORS
726
- else PENDING_ACTION_PRE_HOOK
727
- )
701
+ for selector, expected, implementation in wired_hooks:
728
702
  _check(
729
703
  implementation.value == expected,
730
704
  f"selector 0x{selector.hex()} runs {implementation.value}, not {expected}",
@@ -51,6 +51,7 @@ from ipor_fusion import (
51
51
  VaultSimulator,
52
52
  Web3Context,
53
53
  is_simulate_v1_supported,
54
+ parse_checksum_address,
54
55
  parse_fuse_address,
55
56
  )
56
57
  from ipor_fusion.fuses import AaveV3SupplyFuse
@@ -68,13 +69,13 @@ BASE_CHAIN_ID = ChainId(8453)
68
69
 
69
70
  # IporFusionFactoryProxy on Base. Its clone(...) takes the six arguments
70
71
  # assembled in clone_args() below.
71
- BASE_FUSION_FACTORY = Web3.to_checksum_address(
72
+ BASE_FUSION_FACTORY = parse_checksum_address(
72
73
  "0x1455717668fA96534f675856347A973fA907e922"
73
74
  )
74
75
 
75
76
  # Native (Circle-issued) USDC on Base, 6 decimals. Not the bridged USDbC, a
76
77
  # distinct ERC-20 with its own Aave market and price feed.
77
- BASE_USDC = Web3.to_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
78
+ BASE_USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
78
79
 
79
80
  # Aave V3 market (IporFusionMarkets.AAVE_V3).
80
81
  AAVE_MARKET = IporFusionMarkets.AAVE_V3
@@ -112,21 +113,21 @@ BASE_AAVE_V3_BALANCE_FUSE = parse_fuse_address(
112
113
  # DEPOSITOR-- an end user; only ever holds and deposits funds.
113
114
 
114
115
  # Governance/atomist. Any address; here it happens to be a random EOA.
115
- OWNER = Web3.to_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
116
+ OWNER = parse_checksum_address("0x533ac556E288625B267bD71B7928E0a8B46DcE82")
116
117
 
117
118
  # The alpha operator. Anvil account #0, a well-known test address.
118
- ALPHA = Web3.to_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
119
+ ALPHA = parse_checksum_address("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266")
119
120
 
120
121
  # The depositor -- the end user putting funds in. Never drives execute() and
121
122
  # never holds a governance role. Anvil account #1, the natural sibling to the
122
123
  # alpha's Anvil account #0.
123
- DEPOSITOR = Web3.to_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
124
+ DEPOSITOR = parse_checksum_address("0x70997970C51812dc3A010C7d01b50e0d17dc79C8")
124
125
 
125
126
  # A Base address holding ample USDC, used to fund the depositor via an
126
127
  # impersonated transfer inside the simulation. This is the Morpho Blue core
127
128
  # contract (~150M USDC) -- deliberately a different protocol from Aave, so
128
129
  # funding does not perturb the market the strategy supplies into.
129
- BASE_USDC_WHALE = Web3.to_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
130
+ BASE_USDC_WHALE = parse_checksum_address("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb")
130
131
 
131
132
  # Pinned Base block. Pinning makes the simulation deterministic and immune to
132
133
  # mainnet state drift. It requires an archive node that can serve state at this
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.1.0.dev14"
3
+ version = "4.1.0.dev35"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -127,6 +127,7 @@ from ipor_fusion import (
127
127
  PlasmaVault,
128
128
  Roles,
129
129
  Web3Context,
130
+ parse_checksum_address,
130
131
  parse_fuse_address,
131
132
  )
132
133
  from ipor_fusion.fuses import AaveV3SupplyFuse
@@ -138,8 +139,8 @@ owner = Account.from_key(OWNER_PRIVATE_KEY).address # owns, configures and oper
138
139
  ctx = Web3Context(w3, chain_id=ChainId(8453), signer=owner, private_key=OWNER_PRIVATE_KEY)
139
140
 
140
141
  # Generic addresses are ChecksumAddress; fuse addresses carry their role (FuseAddress).
141
- FACTORY_PROXY = Web3.to_checksum_address("0x1455717668fA96534f675856347A973fA907e922") # IporFusionFactoryProxy, Base
142
- USDC = Web3.to_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
142
+ FACTORY_PROXY = parse_checksum_address("0x1455717668fA96534f675856347A973fA907e922") # IporFusionFactoryProxy, Base
143
+ USDC = parse_checksum_address("0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913")
143
144
  SUPPLY_FUSE = parse_fuse_address("0x26fD6EF391E98C78CfCA27e00c3d15be4D941625") # SupplyFuseAaveV3, Base
144
145
  BALANCE_FUSE = parse_fuse_address("0xf53f3EaFfDf67539256365cA7299540A98b60BA9") # BalanceFuseAaveV3, Base
145
146
 
@@ -387,6 +387,7 @@ from ipor_fusion.types import (
387
387
  format_shares,
388
388
  parse_access_manager_address,
389
389
  parse_amount,
390
+ parse_checksum_address,
390
391
  parse_fuse_address,
391
392
  parse_hex_address,
392
393
  parse_morpho_market_id,
@@ -709,6 +710,7 @@ __all__ = [
709
710
  "FuseAddress",
710
711
  "AccessManagerAddress",
711
712
  "parse_access_manager_address",
713
+ "parse_checksum_address",
712
714
  "parse_fuse_address",
713
715
  "parse_hex_address",
714
716
  "parse_plasma_vault_address",