ipor-fusion 4.0.0.dev74__tar.gz → 4.0.0.dev78__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 (293) hide show
  1. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/MIGRATION_4.md +10 -0
  2. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/PKG-INFO +1 -1
  3. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/pyproject.toml +1 -1
  4. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/chains.py +28 -28
  5. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/explorer.py +3 -1
  6. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/market_ids.py +0 -7
  7. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/morpho_api.py +34 -12
  8. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/hypercore.py +3 -2
  9. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/lending_health.py +5 -10
  10. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/morpho.py +10 -10
  11. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/substrates.py +2 -3
  12. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/vault_info.py +9 -9
  13. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_lending_health.py +3 -4
  14. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_solidity_mirrors.py +0 -2
  15. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_substrates.py +1 -4
  16. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.claude-plugin/marketplace.json +0 -0
  17. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.claude-plugin/plugin.json +0 -0
  18. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.env.example +0 -0
  19. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.gemini/settings.json +0 -0
  20. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.git-blame-ignore-revs +0 -0
  21. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/cd.yml +0 -0
  22. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/ci.yml +0 -0
  23. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/commit-lint.yml +0 -0
  24. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/notify-slack.yml +0 -0
  25. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/python-build.yml +0 -0
  26. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/python-publish.yml +0 -0
  27. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/release.yml +0 -0
  28. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.github/workflows/report-slack.yml +0 -0
  29. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.gitignore +0 -0
  30. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.mcp.json +0 -0
  31. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.pre-commit-config.yaml +0 -0
  32. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/.python-version +0 -0
  33. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/AGENTS.md +0 -0
  34. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/CHANGELOG.md +0 -0
  35. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/CLAUDE.md +0 -0
  36. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/CODEOWNERS +0 -0
  37. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/LICENSE +0 -0
  38. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/README.md +0 -0
  39. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/build.sh +0 -0
  40. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/CONTRIBUTING.md +0 -0
  41. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/README.md +0 -0
  42. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  43. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  44. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  45. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  46. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/external_state_margin_leg_base.py +0 -0
  47. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/examples/simple_aave_v3_supply_base.py +0 -0
  48. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/pytest.ini +0 -0
  49. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/scripts/commit-check.sh +0 -0
  50. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/scripts/crosschain_readiness.py +0 -0
  51. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/skills/ipor-deploy-vault/SKILL.md +0 -0
  52. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/__init__.py +0 -0
  53. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/about.py +0 -0
  54. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cache.py +0 -0
  55. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/__init__.py +0 -0
  56. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  57. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/config_cmd.py +0 -0
  58. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/config_store.py +0 -0
  59. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/main.py +0 -0
  60. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/market_cmd.py +0 -0
  61. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/options.py +0 -0
  62. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  63. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  64. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/vault_health.py +0 -0
  65. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  66. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  67. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  68. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/config/__init__.py +0 -0
  69. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/config/roles.py +0 -0
  70. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/__init__.py +0 -0
  71. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/access.py +0 -0
  72. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/address.py +0 -0
  73. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/context.py +0 -0
  74. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/contract.py +0 -0
  75. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/erc20.py +0 -0
  76. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/external_state_executor.py +0 -0
  77. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/fee_manager.py +0 -0
  78. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/fuse_action.py +0 -0
  79. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/fusion_factory.py +0 -0
  80. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/logs.py +0 -0
  81. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/multicall.py +0 -0
  82. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/oracle.py +0 -0
  83. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/plasma_vault.py +0 -0
  84. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/rewards_manager.py +0 -0
  85. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/simulation.py +0 -0
  86. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  87. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/__init__.py +0 -0
  88. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  89. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  90. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  91. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  92. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  93. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  94. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  95. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  96. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  97. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/contracts.py +0 -0
  98. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/discovery.py +0 -0
  99. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/errors.py +0 -0
  100. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/lane.py +0 -0
  101. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/logs.py +0 -0
  102. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/messages.py +0 -0
  103. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/simulation.py +0 -0
  104. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  105. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  106. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  107. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  108. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  109. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/crosschain/transport.py +0 -0
  110. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/dependency_graph.py +0 -0
  111. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/entry_cli.py +0 -0
  112. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/entry_mcp.py +0 -0
  113. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/errors.py +0 -0
  114. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/field_docs.py +0 -0
  115. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/__init__.py +0 -0
  116. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  117. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/async_action.py +0 -0
  118. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/base.py +0 -0
  119. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  120. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/crosschain/__init__.py +0 -0
  121. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/crosschain/base.py +0 -0
  122. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/crosschain/ccip.py +0 -0
  123. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/crosschain/stargate.py +0 -0
  124. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/erc4626.py +0 -0
  125. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  126. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/events.py +0 -0
  127. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/external_state.py +0 -0
  128. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/external_state_events.py +0 -0
  129. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  130. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  131. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/hypercore.py +0 -0
  132. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
  133. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/merkl.py +0 -0
  134. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/morpho.py +0 -0
  135. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  136. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  137. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/fuses/universal.py +0 -0
  138. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/guide/__init__.py +0 -0
  139. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/guide/architecture.md +0 -0
  140. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/guide/glossary.md +0 -0
  141. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/guide/invariants.md +0 -0
  142. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/guide/quickstart.md +0 -0
  143. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/market_info.py +0 -0
  144. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/mcp/__init__.py +0 -0
  145. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/mcp/guide.py +0 -0
  146. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/mcp/models.py +0 -0
  147. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/mcp/server.py +0 -0
  148. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/py.typed +0 -0
  149. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/__init__.py +0 -0
  150. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/aave_v3.py +0 -0
  151. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/aave_v4.py +0 -0
  152. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/compound_v3.py +0 -0
  153. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  154. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  155. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  156. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  157. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/position_manager.py +0 -0
  158. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  159. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  160. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/readers/unpriceable.py +0 -0
  161. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/types.py +0 -0
  162. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/validation.py +0 -0
  163. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/vault_data.py +0 -0
  164. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/vault_managers.py +0 -0
  165. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/vault_positions.py +0 -0
  166. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/src/ipor_fusion/vault_reads.py +0 -0
  167. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/UniswapV3UniversalRouter.py +0 -0
  168. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_crosschain.py +0 -0
  169. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_crosschain_lifecycle.py +0 -0
  170. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_crosschain_recovery.py +0 -0
  171. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_euler_v2.py +0 -0
  172. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_foundry.py +0 -0
  173. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_guide.py +0 -0
  174. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_hypercore_model.py +0 -0
  175. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_hypercore_shadow.py +0 -0
  176. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_multicall.py +0 -0
  177. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_simulate.py +0 -0
  178. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/_validation.py +0 -0
  179. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/addresses.py +0 -0
  180. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/conftest.py +0 -0
  181. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/constants.py +0 -0
  182. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  183. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/hypercore_market55.json +0 -0
  184. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/vault_info_golden/clean.json +0 -0
  185. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  186. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/vault_info_golden/rich.json +0 -0
  187. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  188. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_about.py +0 -0
  189. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_access_manager.py +0 -0
  190. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cache.py +0 -0
  191. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_chains.py +0 -0
  192. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_changelog.py +0 -0
  193. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_commands.py +0 -0
  194. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_config_store.py +0 -0
  195. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_helpers.py +0 -0
  196. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_hypercore.py +0 -0
  197. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_market_morpho_blue.py +0 -0
  198. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_oracle_mapping.py +0 -0
  199. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_pending_requests_scan.py +0 -0
  200. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_role_accounts.py +0 -0
  201. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_vault_info_golden.py +0 -0
  202. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_vault_predates_getters.py +0 -0
  203. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_cli_vault_validate.py +0 -0
  204. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_contract_call.py +0 -0
  205. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_contract_encoder.py +0 -0
  206. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_ccip_events.py +0 -0
  207. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_ccip_indexer.py +0 -0
  208. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_ccip_quote.py +0 -0
  209. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_chainlink.py +0 -0
  210. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_contracts.py +0 -0
  211. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_encoding.py +0 -0
  212. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_errors.py +0 -0
  213. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_lane.py +0 -0
  214. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_layering.py +0 -0
  215. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_readiness.py +0 -0
  216. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_readiness_report.py +0 -0
  217. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_crosschain_transport.py +0 -0
  218. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_erc20.py +0 -0
  219. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_examples_composed_hypercore.py +0 -0
  220. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_examples_crosschain.py +0 -0
  221. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  222. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_examples_vaults.py +0 -0
  223. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_explorer.py +0 -0
  224. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_external_state_events.py +0 -0
  225. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_external_state_executor.py +0 -0
  226. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_fee_manager.py +0 -0
  227. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_fuse_encoding.py +0 -0
  228. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_fusion_instance.py +0 -0
  229. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_guide.py +0 -0
  230. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_deployment.py +0 -0
  231. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_events.py +0 -0
  232. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_flow.py +0 -0
  233. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_live.py +0 -0
  234. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_outcome.py +0 -0
  235. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_readers.py +0 -0
  236. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_hypercore_simulation.py +0 -0
  237. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_logs.py +0 -0
  238. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_mcp_hypercore.py +0 -0
  239. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_mcp_models.py +0 -0
  240. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_mcp_server.py +0 -0
  241. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_mcp_vault_validate.py +0 -0
  242. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_multicall.py +0 -0
  243. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_oracle.py +0 -0
  244. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_oracle_mapping.py +0 -0
  245. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_plasma_vault.py +0 -0
  246. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_public_api.py +0 -0
  247. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_reader_encoding.py +0 -0
  248. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_readiness_selection.py +0 -0
  249. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_revert_decoding.py +0 -0
  250. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_rewards_manager.py +0 -0
  251. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_roles.py +0 -0
  252. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_sdk_layering.py +0 -0
  253. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  254. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  255. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  256. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_crosschain_canary.py +0 -0
  257. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_crosschain_hypercore.py +0 -0
  258. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  259. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  260. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  261. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  262. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  263. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  264. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  265. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_examples_arbitrum.py +0 -0
  266. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_examples_base.py +0 -0
  267. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_examples_crosschain.py +0 -0
  268. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_external_state_executor_base.py +0 -0
  269. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  270. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  271. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  272. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_morpho_blue.py +0 -0
  273. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_pilot_v3.py +0 -0
  274. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  275. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  276. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  277. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  278. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_readers_integration.py +0 -0
  279. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_release_funds.py +0 -0
  280. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_swap_on_base.py +0 -0
  281. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  282. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_solidity_compiler.py +0 -0
  283. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_types_and_events.py +0 -0
  284. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_unpriceable_tokens.py +0 -0
  285. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_validation.py +0 -0
  286. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_vault_dep_graph.py +0 -0
  287. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_vault_info_onchain_base.py +0 -0
  288. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  289. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_vault_simulator_blocks.py +0 -0
  290. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_web3_context.py +0 -0
  291. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/test_withdraw_manager.py +0 -0
  292. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/tests/typed_client/consumer.py +0 -0
  293. {ipor_fusion-4.0.0.dev74 → ipor_fusion-4.0.0.dev78}/uv.lock +0 -0
@@ -133,6 +133,16 @@ and the Stargate fuse's `eid=` take it (`LayerZeroEid(30101)`).
133
133
  `encode_oft_compose_msg(*, nonce=, src_eid=, amount_ld=, compose_msg=)` takes
134
134
  keyword arguments only. `ZERO_ADDRESS` is a `ChecksumAddress` (same value).
135
135
 
136
+ **Chain registry and removed aliases.** `CHAIN_NAMES`, `CHAIN_NAME_TO_ID`,
137
+ `SUPPORTED_CHAIN_IDS`, `GET_LOGS_RANGE_HINTS`, `BLOCK_EXPLORER_URLS`,
138
+ `MORPHO_BLUE_ADDRESSES`, `AAVE_V3_POOL`, `PUBLIC_ALLOCATOR_ADDRESSES` and
139
+ `HYPERCORE_PENDING_READERS` are keyed by `ChainId` (`HYPEREVM_CHAIN_ID` is one) and
140
+ `explorer.SUPPORTED_CHAINS` is a `frozenset[ChainId]`, so
141
+ `ensure_supported_chain(CHAIN_NAME_TO_ID["ethereum"])` type-checks;
142
+ `PUBLIC_ALLOCATOR_ADDRESSES` values are `ChecksumAddress`. `IporFusionMarkets.RWA`
143
+ is gone: market 50 is `IporFusionMarkets.EXTERNAL_STATE`. `MORPHO_BLUE_ADDRESS` is
144
+ gone: use `morpho_blue_address(chain_id)`.
145
+
136
146
  **Markets and substrates.** Every `IporFusionMarkets` member is a `MarketId`.
137
147
  `decode_substrate`, `market_name`, `format_market_label` take `MarketId`.
138
148
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev74
3
+ Version: 4.0.0.dev78
4
4
  Summary: The IPOR Fusion SDK for Python
5
5
  Project-URL: homepage, https://ipor.io
6
6
  Project-URL: repository, https://github.com/IPOR-Labs/ipor-fusion.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev74"
3
+ version = "4.0.0.dev78"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -5,48 +5,48 @@ from __future__ import annotations
5
5
  from ipor_fusion.errors import UnsupportedChainError
6
6
  from ipor_fusion.types import ChainId
7
7
 
8
- CHAIN_NAMES: dict[int, str] = {
9
- 1: "ethereum",
10
- 42161: "arbitrum",
11
- 8453: "base",
12
- 10: "optimism",
13
- 130: "unichain",
14
- 137: "polygon",
15
- 56: "bsc",
16
- 239: "tac",
17
- 9745: "plasma",
18
- 43114: "avalanche",
19
- 250: "fantom",
20
- 143: "monad",
21
- 999: "hyperevm",
22
- 4663: "robinhood",
23
- 747474: "katana",
24
- 3637: "botanix",
25
- 57073: "ink",
26
- 14: "flare",
8
+ CHAIN_NAMES: dict[ChainId, str] = {
9
+ ChainId(1): "ethereum",
10
+ ChainId(42161): "arbitrum",
11
+ ChainId(8453): "base",
12
+ ChainId(10): "optimism",
13
+ ChainId(130): "unichain",
14
+ ChainId(137): "polygon",
15
+ ChainId(56): "bsc",
16
+ ChainId(239): "tac",
17
+ ChainId(9745): "plasma",
18
+ ChainId(43114): "avalanche",
19
+ ChainId(250): "fantom",
20
+ ChainId(143): "monad",
21
+ ChainId(999): "hyperevm",
22
+ ChainId(4663): "robinhood",
23
+ ChainId(747474): "katana",
24
+ ChainId(3637): "botanix",
25
+ ChainId(57073): "ink",
26
+ ChainId(14): "flare",
27
27
  }
28
28
 
29
- CHAIN_NAME_TO_ID: dict[str, int] = {name: cid for cid, name in CHAIN_NAMES.items()}
29
+ CHAIN_NAME_TO_ID: dict[str, ChainId] = {name: cid for cid, name in CHAIN_NAMES.items()}
30
30
 
31
31
  # Chains the on-chain vault tooling (vault info/health/substrate fetch) is
32
32
  # validated on. A provider for another chain may connect fine and still fail
33
33
  # deeper in the stack (a missing Multicall3, an oracle quirk, an eth_getLogs
34
34
  # cap the adaptive scan cannot page through). Extend only after the full
35
35
  # vault_info path passes on every live vault of that chain.
36
- SUPPORTED_CHAIN_IDS: frozenset[int] = frozenset(
37
- {1, 130, 143, 999, 8453, 9745, 42161, 43114, 747474}
36
+ SUPPORTED_CHAIN_IDS: frozenset[ChainId] = frozenset(
37
+ ChainId(cid) for cid in (1, 130, 143, 999, 8453, 9745, 42161, 43114, 747474)
38
38
  )
39
39
 
40
40
  # First eth_getLogs page size, in blocks, on chains whose providers cap the
41
41
  # range (10,000 blocks) or time out on wide queries. The scan still shrinks a
42
42
  # page the provider rejects; a hint only skips the whole-range attempt and the
43
43
  # probing round trips.
44
- GET_LOGS_RANGE_HINTS: dict[int, int] = {
45
- 130: 10_000,
46
- 9745: 10_000,
47
- 57073: 10_000,
48
- 43114: 1_000_000,
49
- 747474: 1_000_000,
44
+ GET_LOGS_RANGE_HINTS: dict[ChainId, int] = {
45
+ ChainId(130): 10_000,
46
+ ChainId(9745): 10_000,
47
+ ChainId(57073): 10_000,
48
+ ChainId(43114): 1_000_000,
49
+ ChainId(747474): 1_000_000,
50
50
  }
51
51
 
52
52
 
@@ -17,7 +17,9 @@ from ipor_fusion.types import ChainId, TxHash, parse_tx_hash
17
17
 
18
18
  ETHERSCAN_V2_URL = "https://api.etherscan.io/v2/api"
19
19
 
20
- SUPPORTED_CHAINS = {1, 42161, 8453, 10, 137, 56, 43114, 250}
20
+ SUPPORTED_CHAINS: frozenset[ChainId] = frozenset(
21
+ ChainId(cid) for cid in (1, 42161, 8453, 10, 137, 56, 43114, 250)
22
+ )
21
23
 
22
24
  _MAX_RETRIES = 3
23
25
  _RETRY_DELAY = 1.0
@@ -87,13 +87,6 @@ class IporFusionMarkets:
87
87
  # 4 BALANCE_ACCOUNT, 5 STALENESS_MAX, 6 BIG_CHANGE_BPS, 7 DUST_THRESHOLD,
88
88
  # 8 MIN_UPDATE_INTERVAL).
89
89
  EXTERNAL_STATE = MarketId(50)
90
- # Deprecated alias of EXTERNAL_STATE, kept for backward compatibility.
91
- # Reverse id->name lookups skip aliases (see _DEPRECATED_ALIASES) so the
92
- # canonical name is the one displayed.
93
- RWA = MarketId(50)
94
- # Deprecated member names that alias a canonical member of the same value;
95
- # reverse id->name lookups skip these so the canonical name wins.
96
- _DEPRECATED_ALIASES = frozenset({"RWA"})
97
90
  # substrate type: AguaSubstrateLib (VAULT or ASSET)
98
91
  AGUA_GLOBAL_CARRY = MarketId(51)
99
92
  # dependence graph: balance of ERC20_VAULT_BALANCE (purchase tokens return
@@ -26,18 +26,40 @@ MORPHO_API_URL = "https://blue-api.morpho.org/graphql"
26
26
  # Morpho API (`publicAllocators` query). Anyone can call `reallocateTo` on
27
27
  # this contract — the vault must have granted it the ALLOCATOR_ROLE for
28
28
  # public reallocation to actually go through.
29
- PUBLIC_ALLOCATOR_ADDRESSES: dict[int, str] = {
30
- 1: "0xfd32fA2ca22c76dD6E550706Ad913FC6CE91c75D", # Ethereum
31
- 10: "0x0d68a97324E602E02799CD83B42D337207B40658", # OP Mainnet
32
- 137: "0xfac15aff53ADd2ff80C2962127C434E8615Df0d3", # Polygon
33
- 8453: "0xA090dD1a701408Df1d4d0B85b716c87565f90467", # Base
34
- 42161: "0x769583Af5e9D03589F159EbEC31Cc2c23E8C355E", # Arbitrum One
35
- 130: "0xB0c9a107fA17c779B3378210A7a593e88938C7C9", # Unichain
36
- 480: "0xef9889B4e443DEd35FA0Bd060f2104Cca94e6A43", # World Chain
37
- 143: "0xfd70575B732F9482F4197FE1075492e114E97302", # Monad
38
- 999: "0x517505be22D9068687334e69ae7a02fC77edf4Fc", # HyperEVM
39
- 988: "0xbCB063D4B6D479b209C186e462828CBACaC82DbE", # Stable
40
- 747474: "0x39EB6Da5e88194C82B13491Df2e8B3E213eD2412", # Katana
29
+ PUBLIC_ALLOCATOR_ADDRESSES: dict[ChainId, ChecksumAddress] = {
30
+ ChainId(1): Web3.to_checksum_address(
31
+ "0xfd32fA2ca22c76dD6E550706Ad913FC6CE91c75D"
32
+ ), # Ethereum
33
+ ChainId(10): Web3.to_checksum_address(
34
+ "0x0d68a97324E602E02799CD83B42D337207B40658"
35
+ ), # OP Mainnet
36
+ ChainId(137): Web3.to_checksum_address(
37
+ "0xfac15aff53ADd2ff80C2962127C434E8615Df0d3"
38
+ ), # Polygon
39
+ ChainId(8453): Web3.to_checksum_address(
40
+ "0xA090dD1a701408Df1d4d0B85b716c87565f90467"
41
+ ), # Base
42
+ ChainId(42161): Web3.to_checksum_address(
43
+ "0x769583Af5e9D03589F159EbEC31Cc2c23E8C355E"
44
+ ), # Arbitrum One
45
+ ChainId(130): Web3.to_checksum_address(
46
+ "0xB0c9a107fA17c779B3378210A7a593e88938C7C9"
47
+ ), # Unichain
48
+ ChainId(480): Web3.to_checksum_address(
49
+ "0xef9889B4e443DEd35FA0Bd060f2104Cca94e6A43"
50
+ ), # World Chain
51
+ ChainId(143): Web3.to_checksum_address(
52
+ "0xfd70575B732F9482F4197FE1075492e114E97302"
53
+ ), # Monad
54
+ ChainId(999): Web3.to_checksum_address(
55
+ "0x517505be22D9068687334e69ae7a02fC77edf4Fc"
56
+ ), # HyperEVM
57
+ ChainId(988): Web3.to_checksum_address(
58
+ "0xbCB063D4B6D479b209C186e462828CBACaC82DbE"
59
+ ), # Stable
60
+ ChainId(747474): Web3.to_checksum_address(
61
+ "0x39EB6Da5e88194C82B13491Df2e8B3E213eD2412"
62
+ ), # Katana
41
63
  }
42
64
 
43
65
  _MARKET_QUERY = """
@@ -50,6 +50,7 @@ from ipor_fusion.fuses.hypercore import (
50
50
  from ipor_fusion.market_ids import IporFusionMarkets
51
51
  from ipor_fusion.substrates import decode_substrate
52
52
  from ipor_fusion.types import (
53
+ ChainId,
53
54
  FuseAddress,
54
55
  HyperCoreActionId,
55
56
  HyperCoreAsset,
@@ -66,12 +67,12 @@ T = TypeVar("T")
66
67
  #: New HyperCore vaults use market 55; the abandoned pilot still keys 54.
67
68
  HYPERCORE_MARKET = MarketId(IporFusionMarkets.HYPERCORE)
68
69
  #: The only chain with the HyperCore precompiles.
69
- HYPEREVM_CHAIN_ID = 999
70
+ HYPEREVM_CHAIN_ID = ChainId(999)
70
71
  #: Known ``HyperCorePendingReader`` deployments per chain. The reader is a
71
72
  #: stateless helper and any deployment serves any vault. The market-55 reader
72
73
  #: is pinned in ``tests/fixtures/hypercore_market55.json`` until ``ipor-abi``
73
74
  #: publishes it.
74
- HYPERCORE_PENDING_READERS: dict[int, ChecksumAddress] = {
75
+ HYPERCORE_PENDING_READERS: dict[ChainId, ChecksumAddress] = {
75
76
  HYPEREVM_CHAIN_ID: Web3.to_checksum_address(
76
77
  "0x83F54bc9eA4Dd19cb579Daa70368562C7a7534C4"
77
78
  ),
@@ -24,7 +24,6 @@ from ipor_fusion.market_ids import IporFusionMarkets
24
24
  from ipor_fusion.readers.aave_v3 import AaveV3Reader
25
25
  from ipor_fusion.readers.aave_v4 import AaveV4OracleReader, AaveV4SpokeReader
26
26
  from ipor_fusion.readers.morpho import (
27
- MORPHO_BLUE_ADDRESSES,
28
27
  MorphoReader,
29
28
  morpho_blue_address,
30
29
  )
@@ -43,25 +42,21 @@ WAD = 10**18
43
42
  RAY = 10**27
44
43
  ORACLE_PRICE_SCALE = 10**36
45
44
 
46
- # Deprecated: only valid on Ethereum and Base — use `morpho_blue_address(chain_id)`.
47
- # Kept so existing imports keep resolving.
48
- MORPHO_BLUE_ADDRESS: ChecksumAddress = MORPHO_BLUE_ADDRESSES[1]
49
-
50
45
  # Aave V3 Core Pool per chain — the Pool of market AAVE_V3 only. Aave V3 Prime
51
46
  # and SparkLend run on their own Pools, so a market's Pool is read from its
52
47
  # balance fuse (`AaveV3FuseReader.pool`); this map is only the fallback of
53
48
  # `fetch_vault_lending_health` for callers that pass no `aave_pools`.
54
- AAVE_V3_POOL: dict[int, ChecksumAddress] = {
55
- 1: Web3.to_checksum_address(
49
+ AAVE_V3_POOL: dict[ChainId, ChecksumAddress] = {
50
+ ChainId(1): Web3.to_checksum_address(
56
51
  "0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2"
57
52
  ), # Ethereum
58
- 42161: Web3.to_checksum_address(
53
+ ChainId(42161): Web3.to_checksum_address(
59
54
  "0x794a61358D6845594F94dc1DB02A252b5b4814aD"
60
55
  ), # Arbitrum
61
- 8453: Web3.to_checksum_address(
56
+ ChainId(8453): Web3.to_checksum_address(
62
57
  "0xA238Dd80C259a72e81d7e4664a9801593F98d1c5"
63
58
  ), # Base
64
- 10: Web3.to_checksum_address(
59
+ ChainId(10): Web3.to_checksum_address(
65
60
  "0x794a61358D6845594F94dc1DB02A252b5b4814aD"
66
61
  ), # Optimism
67
62
  }
@@ -29,19 +29,19 @@ _addr = Web3.to_checksum_address
29
29
 
30
30
  # Morpho Blue sits at its CREATE2 address (0xBBBB…EEFFCb) on Ethereum and Base
31
31
  # only; every other chain carries an independent deployment. Keyed by chain ID.
32
- MORPHO_BLUE_ADDRESSES: dict[int, ChecksumAddress] = {
33
- 1: _addr("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"), # Ethereum
34
- 8453: _addr("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"), # Base
35
- 42161: _addr("0x6c247b1F6182318877311737BaC0844bAa518F5e"), # Arbitrum One
36
- 130: _addr("0x8f5ae9CddB9f68de460C77730b018Ae7E04a140A"), # Unichain
37
- 143: _addr("0xD5D960E8C380B724a48AC59E2DfF1b2CB4a1eAee"), # Monad
38
- 999: _addr("0x68e37dE8d93d3496ae143F2E900490f6280C57cD"), # HyperEVM
39
- 4663: _addr("0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010"), # Robinhood
40
- 747474: _addr("0xD50F2DffFd62f94Ee4AEd9ca05C61d0753268aBc"), # Katana
32
+ MORPHO_BLUE_ADDRESSES: dict[ChainId, ChecksumAddress] = {
33
+ ChainId(1): _addr("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"), # Ethereum
34
+ ChainId(8453): _addr("0xBBBBBbbBBb9cC5e90e3b3Af64bdAF62C37EEFFCb"), # Base
35
+ ChainId(42161): _addr("0x6c247b1F6182318877311737BaC0844bAa518F5e"), # Arbitrum One
36
+ ChainId(130): _addr("0x8f5ae9CddB9f68de460C77730b018Ae7E04a140A"), # Unichain
37
+ ChainId(143): _addr("0xD5D960E8C380B724a48AC59E2DfF1b2CB4a1eAee"), # Monad
38
+ ChainId(999): _addr("0x68e37dE8d93d3496ae143F2E900490f6280C57cD"), # HyperEVM
39
+ ChainId(4663): _addr("0x9D53d5E3bd5E8d4Cbfa6DB1ca238AEA02E651010"), # Robinhood
40
+ ChainId(747474): _addr("0xD50F2DffFd62f94Ee4AEd9ca05C61d0753268aBc"), # Katana
41
41
  }
42
42
 
43
43
 
44
- def _chain_label(chain_id: int) -> str:
44
+ def _chain_label(chain_id: ChainId) -> str:
45
45
  name = CHAIN_NAMES.get(chain_id)
46
46
  return f"{chain_id} ({name})" if name else str(chain_id)
47
47
 
@@ -511,7 +511,7 @@ _register_markets([11], _decode_euler_v2)
511
511
  # Async Action (typed: amount-to-outside / target+selector / exit slippage)
512
512
  _register_markets([40], _decode_async_action)
513
513
  # External State (typed: asset / target+selector / custodian / balance account
514
- # / four uint248 guards). RWA (50) is the deprecated alias of EXTERNAL_STATE.
514
+ # / four uint248 guards).
515
515
  _register_markets([50], _decode_external_state)
516
516
  # Uniswap V4 (id 53 per IporFusionMarkets.sol): PoolId or pool currency.
517
517
  # TERM_FINANCE (52) stays unregistered on purpose — its substrate library is
@@ -539,10 +539,9 @@ _register_markets([55], _decode_hypercore)
539
539
 
540
540
 
541
541
  def _build_market_lookup() -> dict[int, str]:
542
- aliases = IporFusionMarkets._DEPRECATED_ALIASES
543
542
  lookup: dict[int, str] = {}
544
543
  for name in dir(IporFusionMarkets):
545
- if name.startswith("_") or name in aliases:
544
+ if name.startswith("_"):
546
545
  continue
547
546
  val = getattr(IporFusionMarkets, name)
548
547
  if isinstance(val, int):
@@ -48,15 +48,15 @@ from ipor_fusion.vault_data import (
48
48
  resolve_token_symbol,
49
49
  )
50
50
 
51
- BLOCK_EXPLORER_URLS: dict[int, str] = {
52
- 1: "https://etherscan.io",
53
- 42161: "https://arbiscan.io",
54
- 8453: "https://basescan.org",
55
- 10: "https://optimistic.etherscan.io",
56
- 137: "https://polygonscan.com",
57
- 56: "https://bscscan.com",
58
- 43114: "https://snowtrace.io",
59
- 250: "https://ftmscan.com",
51
+ BLOCK_EXPLORER_URLS: dict[ChainId, str] = {
52
+ ChainId(1): "https://etherscan.io",
53
+ ChainId(42161): "https://arbiscan.io",
54
+ ChainId(8453): "https://basescan.org",
55
+ ChainId(10): "https://optimistic.etherscan.io",
56
+ ChainId(137): "https://polygonscan.com",
57
+ ChainId(56): "https://bscscan.com",
58
+ ChainId(43114): "https://snowtrace.io",
59
+ ChainId(250): "https://ftmscan.com",
60
60
  }
61
61
 
62
62
  IPOR_APP_URL = "https://app.ipor.io/fusion"
@@ -15,7 +15,6 @@ from ipor_fusion.readers.lending_health import (
15
15
  AAVE_V3_MARKET_IDS,
16
16
  AAVE_V3_POOL,
17
17
  AAVE_V4_MARKET_IDS,
18
- MORPHO_BLUE_ADDRESS,
19
18
  MORPHO_MARKET_IDS,
20
19
  ORACLE_PRICE_SCALE,
21
20
  LendingMarketHealth,
@@ -26,8 +25,8 @@ from ipor_fusion.readers.lending_health import (
26
25
  _shares_to_assets_up,
27
26
  fetch_vault_lending_health,
28
27
  )
29
- from ipor_fusion.readers.morpho import MorphoReader
30
- from ipor_fusion.types import MorphoBlueMarketId
28
+ from ipor_fusion.readers.morpho import MorphoReader, morpho_blue_address
29
+ from ipor_fusion.types import ChainId, MorphoBlueMarketId
31
30
 
32
31
  VAULT_ADDR = Web3.to_checksum_address("0x1111111111111111111111111111111111111111")
33
32
  ORACLE_ADDR = Web3.to_checksum_address("0xdDdDddDdDdddDDddDDddDDDDdDdDDdDDdDDDDDDd")
@@ -84,7 +83,7 @@ def _aave_v4_substrate(spoke: str, reserve_id: int, flags: int) -> bytes:
84
83
 
85
84
  def _make_morpho_reader():
86
85
  ctx = MagicMock()
87
- return MorphoReader(ctx, MORPHO_BLUE_ADDRESS), ctx
86
+ return MorphoReader(ctx, morpho_blue_address(ChainId(1))), ctx
88
87
 
89
88
 
90
89
  def _make_aave_reader():
@@ -246,12 +246,10 @@ def test_no_argument_calldata_matches_the_contract(path, function, calldata):
246
246
 
247
247
  def test_market_ids_mirror_ipor_fusion_markets_sol():
248
248
  solidity = _solidity_constants("IporFusionMarkets.sol")
249
- aliases = IporFusionMarkets._DEPRECATED_ALIASES
250
249
  python = {
251
250
  name: value
252
251
  for name in dir(IporFusionMarkets)
253
252
  if not name.startswith("_")
254
- and name not in aliases
255
253
  and isinstance(value := getattr(IporFusionMarkets, name), int)
256
254
  }
257
255
  for name, value in _AHEAD_OF_UPSTREAM.items():
@@ -281,11 +281,8 @@ def test_market_without_decoder_is_labelled_not_guessed():
281
281
  assert info.type_label == "no_decoder(VELODROME_SUPERCHAIN)"
282
282
 
283
283
 
284
- def test_external_state_is_canonical_name_and_rwa_is_alias():
285
- # Market 50 is EXTERNAL_STATE; RWA remains a backward-compatible alias of
286
- # the same value, but the canonical name is what id->name lookups display.
284
+ def test_external_state_is_market_50():
287
285
  assert IporFusionMarkets.EXTERNAL_STATE == 50
288
- assert IporFusionMarkets.RWA == IporFusionMarkets.EXTERNAL_STATE
289
286
  assert market_name(50) == "EXTERNAL_STATE"
290
287
 
291
288