ipor-fusion 4.1.0.dev40__tar.gz → 4.1.0.dev44__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.dev40 → ipor_fusion-4.1.0.dev44}/PKG-INFO +1 -1
  2. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/pyproject.toml +1 -1
  3. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/address.py +5 -3
  4. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/hypercore/__init__.py +2 -0
  5. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/hypercore.py +28 -4
  6. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_fuse_encoding.py +4 -4
  7. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_readers.py +23 -0
  8. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_public_api.py +1 -0
  9. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.claude-plugin/marketplace.json +0 -0
  10. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.claude-plugin/plugin.json +0 -0
  11. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.env.example +0 -0
  12. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.gemini/settings.json +0 -0
  13. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.git-blame-ignore-revs +0 -0
  14. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/cd.yml +0 -0
  15. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/ci.yml +0 -0
  16. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/commit-lint.yml +0 -0
  17. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/notify-slack.yml +0 -0
  18. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/python-build.yml +0 -0
  19. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/python-publish.yml +0 -0
  20. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/release.yml +0 -0
  21. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.github/workflows/report-slack.yml +0 -0
  22. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.gitignore +0 -0
  23. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.mcp.json +0 -0
  24. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.pre-commit-config.yaml +0 -0
  25. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/.python-version +0 -0
  26. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/AGENTS.md +0 -0
  27. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/CHANGELOG.md +0 -0
  28. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/CLAUDE.md +0 -0
  29. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/CODEOWNERS +0 -0
  30. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/LICENSE +0 -0
  31. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/MIGRATION_4.md +0 -0
  32. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/README.md +0 -0
  33. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/build.sh +0 -0
  34. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/CONTRIBUTING.md +0 -0
  35. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/README.md +0 -0
  36. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  37. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  38. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  39. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/external_state_margin_leg_base.py +0 -0
  40. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/hypercore_vault_official_deployment_hyperevm.py +0 -0
  41. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/examples/simple_aave_v3_supply_base.py +0 -0
  42. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/pytest.ini +0 -0
  43. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/scripts/commit-check.sh +0 -0
  44. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/scripts/fusion_error_signatures.py +0 -0
  45. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/skills/ipor-deploy-vault/SKILL.md +0 -0
  46. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/__init__.py +0 -0
  47. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/about.py +0 -0
  48. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cache.py +0 -0
  49. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/chains.py +0 -0
  50. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/__init__.py +0 -0
  51. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/address_cmd.py +0 -0
  52. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  53. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/config_cmd.py +0 -0
  54. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/config_store.py +0 -0
  55. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/main.py +0 -0
  56. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/market_cmd.py +0 -0
  57. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/options.py +0 -0
  58. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  59. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
  60. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  61. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/vault_health.py +0 -0
  62. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  63. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  64. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  65. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/config/__init__.py +0 -0
  66. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/config/roles.py +0 -0
  67. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/__init__.py +0 -0
  68. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/access.py +0 -0
  69. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/context.py +0 -0
  70. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/context_manager.py +0 -0
  71. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/contract.py +0 -0
  72. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/erc20.py +0 -0
  73. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/external_state_executor.py +0 -0
  74. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/fee_manager.py +0 -0
  75. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/fuse.py +0 -0
  76. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/fuse_action.py +0 -0
  77. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/fuse_decoding.py +0 -0
  78. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/fusion_factory.py +0 -0
  79. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/logs.py +0 -0
  80. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/multicall.py +0 -0
  81. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/oracle.py +0 -0
  82. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/plasma_vault.py +0 -0
  83. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/rewards_manager.py +0 -0
  84. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/simulation.py +0 -0
  85. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/simulation_result.py +0 -0
  86. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  87. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/__init__.py +0 -0
  88. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  89. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  90. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  91. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  92. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  93. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  94. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  95. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  96. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  97. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/contracts.py +0 -0
  98. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/discovery.py +0 -0
  99. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/errors.py +0 -0
  100. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  101. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  102. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  103. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  104. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/lane.py +0 -0
  105. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/logs.py +0 -0
  106. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/messages.py +0 -0
  107. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/simulation.py +0 -0
  108. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  109. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  110. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  111. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  112. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  113. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/crosschain/transport.py +0 -0
  114. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/dependency_graph.py +0 -0
  115. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/entry_cli.py +0 -0
  116. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/entry_mcp.py +0 -0
  117. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/errors.py +0 -0
  118. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/explorer.py +0 -0
  119. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/field_docs.py +0 -0
  120. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/__init__.py +0 -0
  121. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  122. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/async_action.py +0 -0
  123. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/base.py +0 -0
  124. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  125. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/erc4626.py +0 -0
  126. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  127. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/events.py +0 -0
  128. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/external_state.py +0 -0
  129. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  130. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  131. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  132. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/hypercore.py +0 -0
  133. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  134. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/hypercore_pre_hooks.py +0 -0
  135. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/merkl.py +0 -0
  136. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/morpho.py +0 -0
  137. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  138. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  139. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fuses/universal.py +0 -0
  140. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/fusion_errors.py +0 -0
  141. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/guide/__init__.py +0 -0
  142. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/guide/architecture.md +0 -0
  143. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/guide/glossary.md +0 -0
  144. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/guide/invariants.md +0 -0
  145. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/guide/quickstart.md +0 -0
  146. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/market_ids.py +0 -0
  147. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/market_info.py +0 -0
  148. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/mcp/__init__.py +0 -0
  149. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/mcp/guide.py +0 -0
  150. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/mcp/models.py +0 -0
  151. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/mcp/server.py +0 -0
  152. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/morpho_api.py +0 -0
  153. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/preflight.py +0 -0
  154. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/py.typed +0 -0
  155. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/__init__.py +0 -0
  156. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/aave_v3.py +0 -0
  157. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/aave_v4.py +0 -0
  158. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/compound_v3.py +0 -0
  159. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/euler_v2.py +0 -0
  160. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  161. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/lending_health.py +0 -0
  162. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/morpho.py +0 -0
  163. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  164. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  165. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  166. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/position_manager.py +0 -0
  167. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  168. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  169. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/readers/unpriceable.py +0 -0
  170. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/registry.py +0 -0
  171. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/substrates.py +0 -0
  172. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/types.py +0 -0
  173. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/validation.py +0 -0
  174. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_data.py +0 -0
  175. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_erc20.py +0 -0
  176. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_info.py +0 -0
  177. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_managers.py +0 -0
  178. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_positions.py +0 -0
  179. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/src/ipor_fusion/vault_reads.py +0 -0
  180. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/UniswapV3UniversalRouter.py +0 -0
  181. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_addresses.py +0 -0
  182. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_crosschain.py +0 -0
  183. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_crosschain_lifecycle.py +0 -0
  184. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_crosschain_recovery.py +0 -0
  185. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_euler_v2.py +0 -0
  186. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_event_args.py +0 -0
  187. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_fake_rpc.py +0 -0
  188. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_foundry.py +0 -0
  189. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_golden.py +0 -0
  190. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_guide.py +0 -0
  191. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_hypercore_model.py +0 -0
  192. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_hypercore_shadow.py +0 -0
  193. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_live.py +0 -0
  194. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_multicall.py +0 -0
  195. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_oracle_mapping_fake.py +0 -0
  196. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_simulate.py +0 -0
  197. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/_validation.py +0 -0
  198. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/addresses.py +0 -0
  199. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/conftest.py +0 -0
  200. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/constants.py +0 -0
  201. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  202. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/hypercore_market55.json +0 -0
  203. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/hypercore_official.json +0 -0
  204. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  205. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  206. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  207. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  208. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  209. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  210. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  211. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  212. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  213. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  214. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  215. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  216. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  217. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  218. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  219. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  220. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/simulate_v1_request.json +0 -0
  221. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/clean.json +0 -0
  222. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  223. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  224. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  225. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  226. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  227. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  228. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  229. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  230. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/full.json +0 -0
  231. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  232. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/full.txt +0 -0
  233. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/rich.json +0 -0
  234. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  235. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  236. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_about.py +0 -0
  237. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_access_manager.py +0 -0
  238. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_addresses_helper.py +0 -0
  239. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cache.py +0 -0
  240. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_chains.py +0 -0
  241. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_address.py +0 -0
  242. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_changelog.py +0 -0
  243. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_commands.py +0 -0
  244. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_config_store.py +0 -0
  245. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_helpers.py +0 -0
  246. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_hypercore.py +0 -0
  247. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_lending_health.py +0 -0
  248. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_market_golden.py +0 -0
  249. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_market_morpho_blue.py +0 -0
  250. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_mcp_parity.py +0 -0
  251. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_oracle_mapping.py +0 -0
  252. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_oracle_mapping_golden.py +0 -0
  253. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_pending_requests_scan.py +0 -0
  254. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_preflight.py +0 -0
  255. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_role_accounts.py +0 -0
  256. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_vault_info_golden.py +0 -0
  257. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_vault_predates_getters.py +0 -0
  258. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_cli_vault_validate.py +0 -0
  259. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_contract_call.py +0 -0
  260. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_contract_encoder.py +0 -0
  261. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_ccip_events.py +0 -0
  262. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_ccip_indexer.py +0 -0
  263. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_ccip_quote.py +0 -0
  264. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_chainlink.py +0 -0
  265. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_contracts.py +0 -0
  266. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_encoding.py +0 -0
  267. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_errors.py +0 -0
  268. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_lane.py +0 -0
  269. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_layering.py +0 -0
  270. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_crosschain_transport.py +0 -0
  271. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_docs_typing.py +0 -0
  272. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_erc20.py +0 -0
  273. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_error_hierarchy.py +0 -0
  274. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_examples_crosschain.py +0 -0
  275. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  276. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_examples_hypercore_hyperevm.py +0 -0
  277. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_examples_vaults.py +0 -0
  278. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_explorer.py +0 -0
  279. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_external_state_events.py +0 -0
  280. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_external_state_executor.py +0 -0
  281. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_fee_manager.py +0 -0
  282. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_fuse_decoding.py +0 -0
  283. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_fusion_errors.py +0 -0
  284. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_fusion_instance.py +0 -0
  285. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_governance_wrappers.py +0 -0
  286. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_guide.py +0 -0
  287. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_deployment.py +0 -0
  288. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_events.py +0 -0
  289. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_flow.py +0 -0
  290. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_live.py +0 -0
  291. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_outcome.py +0 -0
  292. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_pre_hooks.py +0 -0
  293. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_hypercore_simulation.py +0 -0
  294. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_logs.py +0 -0
  295. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_address.py +0 -0
  296. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_hypercore.py +0 -0
  297. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_models.py +0 -0
  298. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_preflight.py +0 -0
  299. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_server.py +0 -0
  300. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_mcp_vault_validate.py +0 -0
  301. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_multicall.py +0 -0
  302. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_oracle.py +0 -0
  303. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_oracle_mapping.py +0 -0
  304. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_plasma_vault.py +0 -0
  305. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_preflight.py +0 -0
  306. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_public_type_reachability.py +0 -0
  307. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_reader_encoding.py +0 -0
  308. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_registry.py +0 -0
  309. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_revert_decoding.py +0 -0
  310. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_rewards_manager.py +0 -0
  311. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_roles.py +0 -0
  312. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_sdk_layering.py +0 -0
  313. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  314. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  315. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  316. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  317. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  318. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  319. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  320. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  321. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  322. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_examples_arbitrum.py +0 -0
  323. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_examples_base.py +0 -0
  324. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_examples_crosschain.py +0 -0
  325. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_examples_hyperevm.py +0 -0
  326. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_external_state_executor_base.py +0 -0
  327. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  328. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  329. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  330. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_morpho_blue.py +0 -0
  331. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_pilot_v3.py +0 -0
  332. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  333. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  334. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  335. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  336. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_preflight_base.py +0 -0
  337. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_readers_integration.py +0 -0
  338. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_release_funds.py +0 -0
  339. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_swap_on_base.py +0 -0
  340. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_timelock_base.py +0 -0
  341. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  342. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulation_errors.py +0 -0
  343. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_simulation_observation.py +0 -0
  344. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_solidity_compiler.py +0 -0
  345. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_solidity_mirrors.py +0 -0
  346. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_substrates.py +0 -0
  347. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_types_and_events.py +0 -0
  348. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_unpriceable_tokens.py +0 -0
  349. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_validation.py +0 -0
  350. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_data_block.py +0 -0
  351. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_dep_graph.py +0 -0
  352. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_info_fetched_golden.py +0 -0
  353. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_info_onchain_base.py +0 -0
  354. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  355. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  356. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_vault_simulator_blocks.py +0 -0
  357. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_web3_context.py +0 -0
  358. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/test_withdraw_manager.py +0 -0
  359. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/typed_client/consumer.py +0 -0
  360. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/tests/typed_client/rejected.py +0 -0
  361. {ipor_fusion-4.1.0.dev40 → ipor_fusion-4.1.0.dev44}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.1.0.dev40
3
+ Version: 4.1.0.dev44
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.1.0.dev40"
3
+ version = "4.1.0.dev44"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -2,13 +2,15 @@ def _validate_not_zero_address(value: str, name: str) -> None:
2
2
  """Reject an empty or zero address; ``name`` labels it in the error.
3
3
 
4
4
  Compares the parsed bytes rather than the text, so every spelling of the
5
- zero address is caught -- ``0x``-prefixed or bare. Input that is not hex at
6
- all falls through to the encoder, which reports the malformed address.
5
+ zero address is caught -- ``0x``- or ``0X``-prefixed, or bare. Input that
6
+ is not hex at all falls through to the encoder, which reports the
7
+ malformed address.
7
8
  """
8
9
  if not value:
9
10
  raise ValueError(f"{name} is required and must not be zero address")
11
+ digits = value[2:] if value[:2].lower() == "0x" else value
10
12
  try:
11
- payload = bytes.fromhex(value.removeprefix("0x"))
13
+ payload = bytes.fromhex(digits)
12
14
  except ValueError:
13
15
  return
14
16
  if payload == bytes(20):
@@ -73,6 +73,7 @@ from ipor_fusion.readers.hypercore import (
73
73
  USD6_DECIMALS,
74
74
  HyperCoreAccountMarginSummary,
75
75
  HyperCoreActionClass,
76
+ HyperCoreBbo,
76
77
  HyperCoreEffectKind,
77
78
  HyperCoreNav,
78
79
  HyperCorePendingReader,
@@ -137,6 +138,7 @@ __all__ = [
137
138
  "HyperCoreActionSettledArgs",
138
139
  "HyperCoreActionSettledEvent",
139
140
  "HyperCoreAsset",
141
+ "HyperCoreBbo",
140
142
  "HyperCoreBuilderFeeFuse",
141
143
  "HyperCoreBuilderFeeFuseEnterArgs",
142
144
  "HyperCoreBuilderFeeFuseEnterEvent",
@@ -99,6 +99,7 @@ ORACLE_PX_PRECOMPILE = _precompile(0x807)
99
99
  L1_BLOCK_NUMBER_PRECOMPILE = _precompile(0x809)
100
100
  PERP_ASSET_INFO_PRECOMPILE = _precompile(0x80A)
101
101
  TOKEN_INFO_PRECOMPILE = _precompile(0x80C)
102
+ BBO_PRECOMPILE = _precompile(0x80E)
102
103
  ACCOUNT_MARGIN_SUMMARY_PRECOMPILE = _precompile(0x80F)
103
104
  CORE_USER_EXISTS_PRECOMPILE = _precompile(0x810)
104
105
  #: ``position2``: same layout as ``position`` (``0x800``), which reads indexes up
@@ -170,6 +171,15 @@ class HyperCorePerpAssetInfo:
170
171
  only_isolated: bool
171
172
 
172
173
 
174
+ @dataclass(frozen=True, slots=True)
175
+ class HyperCoreBbo:
176
+ """``bbo`` precompile result: the best bid and ask, ``None`` for an empty
177
+ side of the book, which the precompile answers as 0 (never a real price)."""
178
+
179
+ bid: int | None
180
+ ask: int | None
181
+
182
+
173
183
  @dataclass(frozen=True, slots=True)
174
184
  class HyperCorePosition:
175
185
  """``position`` precompile result; ``szi`` and ``isolated_raw_usd`` are
@@ -225,14 +235,19 @@ def _position(values: tuple[int, int, int, int, bool]) -> HyperCorePosition:
225
235
  return HyperCorePosition(*values)
226
236
 
227
237
 
238
+ def _bbo(values: tuple[int, int]) -> HyperCoreBbo:
239
+ bid, ask = values
240
+ return HyperCoreBbo(bid=bid or None, ask=ask or None)
241
+
242
+
228
243
  class HyperCoreReader:
229
244
  """The HyperCore read precompiles as :class:`Call`s.
230
245
 
231
- Mirrors ``HyperCoreLib``'s reads: a precompile takes its arguments as raw
232
- ABI-encoded words (no selector) and answers one ABI-encoded value. The
233
- perp reads take the *read index* of a market
246
+ Mirrors ``HyperCoreLib``'s reads, plus :meth:`bbo`: a precompile takes its
247
+ arguments as raw ABI-encoded words (no selector) and answers one
248
+ ABI-encoded value. The perp reads take the *read index* of a market
234
249
  (:func:`ipor_fusion.hypercore.precompile_index_of`: the action asset without the HIP-3
235
- offset), never the action asset itself.
250
+ offset); only :meth:`bbo` takes the action asset itself.
236
251
  """
237
252
 
238
253
  def _read(
@@ -329,6 +344,15 @@ class HyperCoreReader:
329
344
  _validate_uint(read_index, 32, "read_index")
330
345
  return self._read(MARK_PX_PRECOMPILE, ["uint32"], [read_index], ["uint64"])
331
346
 
347
+ def bbo(self, asset: HyperCoreAsset) -> Call[HyperCoreBbo]:
348
+ """The best bid and ask of ``asset``, the action asset an order takes
349
+ (a HIP-3 read index answers another market's book). A perp's prices
350
+ have :func:`perp_px_decimals` decimals."""
351
+ _validate_uint(asset, 32, "asset")
352
+ return self._read(
353
+ BBO_PRECOMPILE, ["uint32"], [asset], ["uint64", "uint64"], _bbo
354
+ )
355
+
332
356
  def l1_block_number(self) -> Call[int]:
333
357
  return self._read(L1_BLOCK_NUMBER_PRECOMPILE, [], [], ["uint64"])
334
358
 
@@ -748,7 +748,7 @@ class TestUniversalTokenSwapperSubstrates:
748
748
  with pytest.raises(ValueError, match="20-byte"):
749
749
  UniversalTokenSwapperSubstrates.token("0x1234") # type: ignore[arg-type]
750
750
 
751
- @pytest.mark.parametrize("spelling", [ZERO_ADDRESS, "0" * 40])
751
+ @pytest.mark.parametrize("spelling", [ZERO_ADDRESS, "0X" + "0" * 40, "0" * 40])
752
752
  def test_zero_address_rejected(self, spelling):
753
753
  # Mirrors UniversalTokenSwapperSubstrateLibZeroAddress on-chain. The
754
754
  # error names the field, so a guard wired to the wrong one would show.
@@ -1214,9 +1214,9 @@ class TestSlippageParamsAllowZero:
1214
1214
  class TestFuseConstructorValidation:
1215
1215
  """Fuse constructor must reject zero and empty addresses."""
1216
1216
 
1217
- @pytest.mark.parametrize("spelling", [ZERO_ADDR, "0" * 40])
1217
+ @pytest.mark.parametrize("spelling", [ZERO_ADDR, "0X" + "0" * 40, "0" * 40])
1218
1218
  def test_zero_address_rejected(self, spelling):
1219
- # Prefixed and un-prefixed name the same address; both must be caught.
1219
+ # Every prefix spelling names the same address; all must be caught.
1220
1220
  with pytest.raises(ValueError, match="zero address"):
1221
1221
  AaveV3SupplyFuse(spelling)
1222
1222
 
@@ -2203,7 +2203,7 @@ class TestExternalStateSubstrates:
2203
2203
  @pytest.mark.parametrize(
2204
2204
  ("encoder", "field"), _ADDRESS_ENCODERS, ids=_ADDRESS_ENCODER_IDS
2205
2205
  )
2206
- @pytest.mark.parametrize("spelling", [ZERO_ADDRESS, "0" * 40])
2206
+ @pytest.mark.parametrize("spelling", [ZERO_ADDRESS, "0X" + "0" * 40, "0" * 40])
2207
2207
  def test_zero_address_rejected(self, encoder, field, spelling):
2208
2208
  # Mirrors ExternalStateErrors.ExternalStateZeroAddress on-chain. The
2209
2209
  # bare spelling matters: config files and CSV exports drop the 0x, and
@@ -21,6 +21,7 @@ from ipor_fusion import (
21
21
  )
22
22
  from ipor_fusion.hypercore import (
23
23
  HyperCoreActionClass,
24
+ HyperCoreBbo,
24
25
  HyperCoreEffectKind,
25
26
  HyperCoreNav,
26
27
  HyperCorePendingReader,
@@ -152,11 +153,33 @@ class TestPrecompileCalls:
152
153
  self.reader.core_user_exists(VAULT).decode(encode(["bool"], [True])) is True
153
154
  )
154
155
 
156
+ def test_bbo_takes_the_action_asset(self):
157
+ call = self.reader.bbo(110_002)
158
+ # The literal, so a wrong BBO_PRECOMPILE fails.
159
+ assert call.to == Web3.to_checksum_address("0x" + "00" * 18 + "080e")
160
+ assert call.data == encode(["uint32"], [110_002])
161
+ bbo = call.decode(encode(["uint64", "uint64"], [213_750, 213_770]))
162
+ assert bbo == HyperCoreBbo(bid=213_750, ask=213_770)
163
+
164
+ def test_bbo_reads_an_empty_side_as_none(self):
165
+ empty_ask = self.reader.bbo(10_200).decode(
166
+ encode(["uint64", "uint64"], [18_700_000, 0])
167
+ )
168
+ assert empty_ask == HyperCoreBbo(bid=18_700_000, ask=None)
169
+ empty_bid = self.reader.bbo(10_200).decode(
170
+ encode(["uint64", "uint64"], [0, 18_800_000])
171
+ )
172
+ assert empty_bid == HyperCoreBbo(bid=None, ask=18_800_000)
173
+ empty = self.reader.bbo(10_220).decode(encode(["uint64", "uint64"], [0, 0]))
174
+ assert empty == HyperCoreBbo(bid=None, ask=None)
175
+
155
176
  def test_arguments_are_width_checked(self):
156
177
  with pytest.raises(ValueError, match="uint64"):
157
178
  self.reader.spot_balance(VAULT, 1 << 64)
158
179
  with pytest.raises(ValueError, match="uint32"):
159
180
  self.reader.perp_asset_info(1 << 32)
181
+ with pytest.raises(ValueError, match="uint32"):
182
+ self.reader.bbo(1 << 32)
160
183
 
161
184
 
162
185
  USDC = Web3.to_checksum_address("0xb88339cb7199b77e23db6e890353e22632ba630f")
@@ -467,6 +467,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
467
467
  "HyperCoreActionSettledArgs",
468
468
  "HyperCoreActionSettledEvent",
469
469
  "HyperCoreAsset",
470
+ "HyperCoreBbo",
470
471
  "HyperCoreBuilderFeeFuse",
471
472
  "HyperCoreBuilderFeeFuseEnterArgs",
472
473
  "HyperCoreBuilderFeeFuseEnterEvent",