ipor-fusion 4.1.0.dev38__tar.gz → 4.1.0.dev42__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.dev38 → ipor_fusion-4.1.0.dev42}/PKG-INFO +1 -1
  2. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/hypercore_vault_official_deployment_hyperevm.py +10 -6
  3. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/pyproject.toml +1 -1
  4. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/address.py +5 -3
  5. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/hypercore.py +5 -2
  6. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/hypercore/__init__.py +8 -0
  7. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/hypercore.py +16 -0
  8. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_fuse_encoding.py +4 -4
  9. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_readers.py +12 -0
  10. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_public_api.py +4 -0
  11. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.claude-plugin/marketplace.json +0 -0
  12. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.claude-plugin/plugin.json +0 -0
  13. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.env.example +0 -0
  14. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.gemini/settings.json +0 -0
  15. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.git-blame-ignore-revs +0 -0
  16. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/cd.yml +0 -0
  17. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/ci.yml +0 -0
  18. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/commit-lint.yml +0 -0
  19. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/notify-slack.yml +0 -0
  20. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/python-build.yml +0 -0
  21. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/python-publish.yml +0 -0
  22. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/release.yml +0 -0
  23. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.github/workflows/report-slack.yml +0 -0
  24. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.gitignore +0 -0
  25. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.mcp.json +0 -0
  26. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.pre-commit-config.yaml +0 -0
  27. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/.python-version +0 -0
  28. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/AGENTS.md +0 -0
  29. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/CHANGELOG.md +0 -0
  30. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/CLAUDE.md +0 -0
  31. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/CODEOWNERS +0 -0
  32. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/LICENSE +0 -0
  33. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/MIGRATION_4.md +0 -0
  34. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/README.md +0 -0
  35. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/build.sh +0 -0
  36. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/CONTRIBUTING.md +0 -0
  37. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/README.md +0 -0
  38. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  39. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  40. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  41. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/external_state_margin_leg_base.py +0 -0
  42. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/examples/simple_aave_v3_supply_base.py +0 -0
  43. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/pytest.ini +0 -0
  44. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/scripts/commit-check.sh +0 -0
  45. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/scripts/fusion_error_signatures.py +0 -0
  46. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/skills/ipor-deploy-vault/SKILL.md +0 -0
  47. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/__init__.py +0 -0
  48. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/about.py +0 -0
  49. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cache.py +0 -0
  50. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/chains.py +0 -0
  51. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/__init__.py +0 -0
  52. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/address_cmd.py +0 -0
  53. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  54. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/config_cmd.py +0 -0
  55. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/config_store.py +0 -0
  56. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/main.py +0 -0
  57. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/market_cmd.py +0 -0
  58. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/options.py +0 -0
  59. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  60. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
  61. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  62. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/vault_health.py +0 -0
  63. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  64. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  65. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  66. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/config/__init__.py +0 -0
  67. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/config/roles.py +0 -0
  68. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/__init__.py +0 -0
  69. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/access.py +0 -0
  70. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/context.py +0 -0
  71. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/context_manager.py +0 -0
  72. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/contract.py +0 -0
  73. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/erc20.py +0 -0
  74. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/external_state_executor.py +0 -0
  75. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/fee_manager.py +0 -0
  76. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/fuse.py +0 -0
  77. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/fuse_action.py +0 -0
  78. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/fuse_decoding.py +0 -0
  79. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/fusion_factory.py +0 -0
  80. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/logs.py +0 -0
  81. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/multicall.py +0 -0
  82. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/oracle.py +0 -0
  83. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/plasma_vault.py +0 -0
  84. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/rewards_manager.py +0 -0
  85. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/simulation.py +0 -0
  86. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/simulation_result.py +0 -0
  87. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  88. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/__init__.py +0 -0
  89. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  90. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  91. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  92. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  93. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  94. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  95. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  96. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  97. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  98. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/contracts.py +0 -0
  99. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/discovery.py +0 -0
  100. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/errors.py +0 -0
  101. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  102. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  103. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  104. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  105. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/lane.py +0 -0
  106. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/logs.py +0 -0
  107. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/messages.py +0 -0
  108. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/simulation.py +0 -0
  109. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  110. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  111. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  112. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  113. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  114. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/crosschain/transport.py +0 -0
  115. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/dependency_graph.py +0 -0
  116. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/entry_cli.py +0 -0
  117. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/entry_mcp.py +0 -0
  118. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/errors.py +0 -0
  119. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/explorer.py +0 -0
  120. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/field_docs.py +0 -0
  121. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/__init__.py +0 -0
  122. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  123. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/async_action.py +0 -0
  124. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/base.py +0 -0
  125. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  126. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/erc4626.py +0 -0
  127. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  128. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/events.py +0 -0
  129. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/external_state.py +0 -0
  130. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  131. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  132. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  133. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  134. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/hypercore_pre_hooks.py +0 -0
  135. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/merkl.py +0 -0
  136. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/morpho.py +0 -0
  137. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  138. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  139. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fuses/universal.py +0 -0
  140. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/fusion_errors.py +0 -0
  141. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/guide/__init__.py +0 -0
  142. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/guide/architecture.md +0 -0
  143. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/guide/glossary.md +0 -0
  144. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/guide/invariants.md +0 -0
  145. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/guide/quickstart.md +0 -0
  146. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/market_ids.py +0 -0
  147. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/market_info.py +0 -0
  148. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/mcp/__init__.py +0 -0
  149. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/mcp/guide.py +0 -0
  150. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/mcp/models.py +0 -0
  151. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/mcp/server.py +0 -0
  152. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/morpho_api.py +0 -0
  153. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/preflight.py +0 -0
  154. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/py.typed +0 -0
  155. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/__init__.py +0 -0
  156. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/aave_v3.py +0 -0
  157. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/aave_v4.py +0 -0
  158. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/compound_v3.py +0 -0
  159. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/euler_v2.py +0 -0
  160. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  161. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/lending_health.py +0 -0
  162. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/morpho.py +0 -0
  163. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  164. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  165. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  166. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/position_manager.py +0 -0
  167. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  168. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  169. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/readers/unpriceable.py +0 -0
  170. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/registry.py +0 -0
  171. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/substrates.py +0 -0
  172. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/types.py +0 -0
  173. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/validation.py +0 -0
  174. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_data.py +0 -0
  175. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_erc20.py +0 -0
  176. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_info.py +0 -0
  177. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_managers.py +0 -0
  178. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_positions.py +0 -0
  179. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/src/ipor_fusion/vault_reads.py +0 -0
  180. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/UniswapV3UniversalRouter.py +0 -0
  181. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_addresses.py +0 -0
  182. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_crosschain.py +0 -0
  183. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_crosschain_lifecycle.py +0 -0
  184. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_crosschain_recovery.py +0 -0
  185. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_euler_v2.py +0 -0
  186. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_event_args.py +0 -0
  187. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_fake_rpc.py +0 -0
  188. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_foundry.py +0 -0
  189. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_golden.py +0 -0
  190. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_guide.py +0 -0
  191. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_hypercore_model.py +0 -0
  192. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_hypercore_shadow.py +0 -0
  193. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_live.py +0 -0
  194. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_multicall.py +0 -0
  195. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_oracle_mapping_fake.py +0 -0
  196. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_simulate.py +0 -0
  197. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/_validation.py +0 -0
  198. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/addresses.py +0 -0
  199. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/conftest.py +0 -0
  200. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/constants.py +0 -0
  201. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  202. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/hypercore_market55.json +0 -0
  203. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/hypercore_official.json +0 -0
  204. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  205. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  206. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  207. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  208. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  209. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  210. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  211. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  212. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  213. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  214. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  215. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  216. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  217. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  218. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  219. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  220. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/simulate_v1_request.json +0 -0
  221. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/clean.json +0 -0
  222. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  223. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  224. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  225. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  226. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  227. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  228. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  229. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  230. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/full.json +0 -0
  231. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  232. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/full.txt +0 -0
  233. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/rich.json +0 -0
  234. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  235. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  236. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_about.py +0 -0
  237. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_access_manager.py +0 -0
  238. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_addresses_helper.py +0 -0
  239. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cache.py +0 -0
  240. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_chains.py +0 -0
  241. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_address.py +0 -0
  242. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_changelog.py +0 -0
  243. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_commands.py +0 -0
  244. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_config_store.py +0 -0
  245. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_helpers.py +0 -0
  246. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_hypercore.py +0 -0
  247. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_lending_health.py +0 -0
  248. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_market_golden.py +0 -0
  249. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_market_morpho_blue.py +0 -0
  250. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_mcp_parity.py +0 -0
  251. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_oracle_mapping.py +0 -0
  252. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_oracle_mapping_golden.py +0 -0
  253. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_pending_requests_scan.py +0 -0
  254. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_preflight.py +0 -0
  255. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_role_accounts.py +0 -0
  256. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_vault_info_golden.py +0 -0
  257. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_vault_predates_getters.py +0 -0
  258. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_cli_vault_validate.py +0 -0
  259. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_contract_call.py +0 -0
  260. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_contract_encoder.py +0 -0
  261. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_ccip_events.py +0 -0
  262. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_ccip_indexer.py +0 -0
  263. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_ccip_quote.py +0 -0
  264. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_chainlink.py +0 -0
  265. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_contracts.py +0 -0
  266. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_encoding.py +0 -0
  267. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_errors.py +0 -0
  268. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_lane.py +0 -0
  269. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_layering.py +0 -0
  270. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_crosschain_transport.py +0 -0
  271. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_docs_typing.py +0 -0
  272. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_erc20.py +0 -0
  273. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_error_hierarchy.py +0 -0
  274. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_examples_crosschain.py +0 -0
  275. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  276. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_examples_hypercore_hyperevm.py +0 -0
  277. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_examples_vaults.py +0 -0
  278. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_explorer.py +0 -0
  279. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_external_state_events.py +0 -0
  280. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_external_state_executor.py +0 -0
  281. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_fee_manager.py +0 -0
  282. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_fuse_decoding.py +0 -0
  283. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_fusion_errors.py +0 -0
  284. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_fusion_instance.py +0 -0
  285. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_governance_wrappers.py +0 -0
  286. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_guide.py +0 -0
  287. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_deployment.py +0 -0
  288. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_events.py +0 -0
  289. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_flow.py +0 -0
  290. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_live.py +0 -0
  291. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_outcome.py +0 -0
  292. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_pre_hooks.py +0 -0
  293. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_hypercore_simulation.py +0 -0
  294. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_logs.py +0 -0
  295. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_address.py +0 -0
  296. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_hypercore.py +0 -0
  297. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_models.py +0 -0
  298. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_preflight.py +0 -0
  299. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_server.py +0 -0
  300. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_mcp_vault_validate.py +0 -0
  301. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_multicall.py +0 -0
  302. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_oracle.py +0 -0
  303. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_oracle_mapping.py +0 -0
  304. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_plasma_vault.py +0 -0
  305. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_preflight.py +0 -0
  306. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_public_type_reachability.py +0 -0
  307. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_reader_encoding.py +0 -0
  308. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_registry.py +0 -0
  309. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_revert_decoding.py +0 -0
  310. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_rewards_manager.py +0 -0
  311. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_roles.py +0 -0
  312. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_sdk_layering.py +0 -0
  313. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  314. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  315. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  316. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  317. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  318. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  319. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  320. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  321. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  322. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_examples_arbitrum.py +0 -0
  323. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_examples_base.py +0 -0
  324. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_examples_crosschain.py +0 -0
  325. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_examples_hyperevm.py +0 -0
  326. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_external_state_executor_base.py +0 -0
  327. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  328. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  329. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  330. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_morpho_blue.py +0 -0
  331. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_pilot_v3.py +0 -0
  332. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  333. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  334. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  335. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  336. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_preflight_base.py +0 -0
  337. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_readers_integration.py +0 -0
  338. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_release_funds.py +0 -0
  339. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_swap_on_base.py +0 -0
  340. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_timelock_base.py +0 -0
  341. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  342. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulation_errors.py +0 -0
  343. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_simulation_observation.py +0 -0
  344. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_solidity_compiler.py +0 -0
  345. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_solidity_mirrors.py +0 -0
  346. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_substrates.py +0 -0
  347. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_types_and_events.py +0 -0
  348. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_unpriceable_tokens.py +0 -0
  349. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_validation.py +0 -0
  350. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_data_block.py +0 -0
  351. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_dep_graph.py +0 -0
  352. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_info_fetched_golden.py +0 -0
  353. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_info_onchain_base.py +0 -0
  354. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  355. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  356. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_vault_simulator_blocks.py +0 -0
  357. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_web3_context.py +0 -0
  358. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/test_withdraw_manager.py +0 -0
  359. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/typed_client/consumer.py +0 -0
  360. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/tests/typed_client/rejected.py +0 -0
  361. {ipor_fusion-4.1.0.dev38 → ipor_fusion-4.1.0.dev42}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.1.0.dev38
3
+ Version: 4.1.0.dev42
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
@@ -95,12 +95,14 @@ from ipor_fusion import (
95
95
  Web3Context,
96
96
  decode_substrate,
97
97
  erc20_balance_slot,
98
+ format_amount,
98
99
  is_simulate_v1_supported,
99
100
  parse_checksum_address,
100
101
  parse_fuse_address,
101
102
  )
102
103
  from ipor_fusion.hypercore import (
103
104
  HYPERCORE_PENDING_READERS,
105
+ ORDER_DECIMALS,
104
106
  SPOT_DEX,
105
107
  USDC_SYSTEM_ADDRESS,
106
108
  USDC_TOKEN_INDEX,
@@ -119,6 +121,7 @@ from ipor_fusion.hypercore import (
119
121
  TimeInForce,
120
122
  decode_hypercore_event,
121
123
  hip3_action_asset,
124
+ perp_px_decimals,
122
125
  precompile_index_of,
123
126
  )
124
127
  from ipor_fusion.market_ids import IporFusionMarkets
@@ -224,9 +227,10 @@ BRIDGE_AMOUNT = Amount(15_000_000) # 15 USDC EVM -> Core
224
227
  # whose default is that same 1 USDC in Core wei.
225
228
  ACTIVATION_FEE_WEI = 100_000_000
226
229
  TO_DEX_WEI = 1_000_000_000 # 10 USDC spot -> xyz dex
227
- ORDER_SIZE = 5_000_000 # 0.05 xyz:NVDA (a multiple of the 10**(8 - 3) lot)
228
- LIMIT_BUY_PX = 230 * 10**8 # pays at most 230 USD
229
- LIMIT_SELL_PX = 220 * 10**8 # sells at no less than 220 USD
230
+ # 0.05 xyz:NVDA, a multiple of its 10**(ORDER_DECIMALS - 3) lot
231
+ ORDER_SIZE = 5 * 10 ** (ORDER_DECIMALS - 2)
232
+ LIMIT_BUY_PX = 230 * 10**ORDER_DECIMALS # pays at most 230 USD
233
+ LIMIT_SELL_PX = 220 * 10**ORDER_DECIMALS # sells at no less than 220 USD
230
234
  # Core -> EVM: a spot -> spot sendAsset to the USDC system address. The amount
231
235
  # must be a multiple of 100 Core wei (representable in 6 EVM decimals); Core
232
236
  # takes its transfer fee from what stays on spot.
@@ -374,7 +378,7 @@ def core_ledger() -> tuple[CoreAnswers, ...]:
374
378
  bridged = BRIDGE_AMOUNT * CORE_WEI_PER_EVM_UNIT - ACTIVATION_FEE_WEI
375
379
  mark = 225_000
376
380
  on_dex = TO_DEX_WEI // 100 # Core wei -> USD6
377
- filled = ORDER_SIZE // 10 ** (8 - XYZ_NVDA_SZ_DECIMALS)
381
+ filled = ORDER_SIZE // 10 ** (ORDER_DECIMALS - XYZ_NVDA_SZ_DECIMALS)
378
382
  return (
379
383
  CoreAnswers(False, 0, 0, 0, mark), # before the bridge: no Core account
380
384
  CoreAnswers(True, bridged, 0, 0, mark), # the bridge landed
@@ -481,7 +485,7 @@ def check_core_metadata(
481
485
  f"{XYZ_NVDA_COIN} szDecimals is {nvda_info.sz_decimals}",
482
486
  )
483
487
  _check(
484
- ORDER_SIZE % 10 ** (8 - nvda_info.sz_decimals) == 0,
488
+ ORDER_SIZE % 10 ** (ORDER_DECIMALS - nvda_info.sz_decimals) == 0,
485
489
  "the order size is not a whole number of lots",
486
490
  )
487
491
 
@@ -512,7 +516,7 @@ def read_core_metadata_at_head(web3: Web3) -> None:
512
516
  wallet_token,
513
517
  nvda_info.coin,
514
518
  nvda_info.sz_decimals,
515
- mark / 10 ** (6 - nvda_info.sz_decimals),
519
+ format_amount(Amount(mark), perp_px_decimals(nvda_info.sz_decimals)),
516
520
  )
517
521
 
518
522
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.1.0.dev38"
3
+ version = "4.1.0.dev42"
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):
@@ -17,7 +17,7 @@ native perp dex is 0. A HIP-3 builder-deployed market is addressed by its
17
17
  action asset ``100_000 + dex * 10_000 + index_in_dex`` in orders, cancels and
18
18
  the PerpMarket substrate; the read precompiles take ``dex * 10_000 +
19
19
  index_in_dex`` instead (:func:`precompile_index_of`). Amounts are Core integers:
20
- ``limit_px`` and ``sz`` carry 8 implied decimals, ``usd6`` 6, and
20
+ ``limit_px`` and ``sz`` carry :data:`ORDER_DECIMALS` implied decimals, ``usd6`` 6, and
21
21
  ``amount_wei`` is Core wei (8 decimals for USDC).
22
22
 
23
23
  ABI (one struct argument per method)::
@@ -64,6 +64,8 @@ from ipor_fusion.types import (
64
64
  SPOT_DEX = 0xFFFFFFFF
65
65
  #: ``HyperCoreLib.NATIVE_PERP_DEX``: Hyperliquid's own perp dex.
66
66
  NATIVE_PERP_DEX = 0
67
+ #: Decimals of ``limit_px`` and ``sz`` in :meth:`HyperCoreOrderFuse.enter`.
68
+ ORDER_DECIMALS = 8
67
69
  #: Core token index of USDC.
68
70
  USDC_TOKEN_INDEX = HyperCoreTokenIndex(0)
69
71
  #: Core -> EVM route for token 0: a spot -> spot ``sendAsset`` to this address
@@ -297,7 +299,8 @@ class HyperCoreOrderFuse(Fuse):
297
299
  cloid: HyperCoreClientOrderId,
298
300
  reduce_only: bool = False,
299
301
  ) -> FuseAction:
300
- """Place ``sz`` (8 decimals) of ``asset`` at ``limit_px`` (8 decimals).
302
+ """Place ``sz`` of ``asset`` at ``limit_px``, both with
303
+ :data:`ORDER_DECIMALS` decimals.
301
304
  The fuse enforces the market's notional cap and lot size and, for
302
305
  HIP-3 markets, that this is the vault's only PerpMarket grant."""
303
306
  _validate_uint(asset, 32, "asset")
@@ -8,6 +8,7 @@ with no backward compatibility, which is why they live here rather than in
8
8
  """
9
9
 
10
10
  from ipor_fusion.fuses.hypercore import (
11
+ ORDER_DECIMALS,
11
12
  RESERVED_HYPERCORE_CONFIG_KEYS,
12
13
  SPOT_DEX,
13
14
  USDC_SYSTEM_ADDRESS,
@@ -68,6 +69,8 @@ from ipor_fusion.fuses.hypercore_pre_hooks import (
68
69
  from ipor_fusion.readers.hypercore import (
69
70
  HYPERCORE_MARKET,
70
71
  HYPERCORE_PENDING_READERS,
72
+ PERP_MAX_DECIMALS,
73
+ USD6_DECIMALS,
71
74
  HyperCoreAccountMarginSummary,
72
75
  HyperCoreActionClass,
73
76
  HyperCoreEffectKind,
@@ -84,6 +87,7 @@ from ipor_fusion.readers.hypercore import (
84
87
  HyperCoreTokenInfo,
85
88
  HyperCoreVaultState,
86
89
  convert_to_wad_int,
90
+ perp_px_decimals,
87
91
  read_hypercore_nav,
88
92
  read_hypercore_vault_state,
89
93
  )
@@ -110,9 +114,12 @@ from ipor_fusion.types import (
110
114
 
111
115
  __all__ = [
112
116
  "MarginTableId",
117
+ "ORDER_DECIMALS",
118
+ "PERP_MAX_DECIMALS",
113
119
  "PayloadHash",
114
120
  "SPOT_DEX",
115
121
  "TransferDirection",
122
+ "USD6_DECIMALS",
116
123
  "USDC_SYSTEM_ADDRESS",
117
124
  "USDC_TOKEN_INDEX",
118
125
  "HYPERCORE_CAPITAL_FLOW_SELECTORS",
@@ -190,6 +197,7 @@ __all__ = [
190
197
  "is_hip3_asset",
191
198
  "is_native_perp_asset",
192
199
  "perp_dex_of",
200
+ "perp_px_decimals",
193
201
  "precompile_index_of",
194
202
  "read_hypercore_evm_exit_ceiling",
195
203
  "read_hypercore_nav",
@@ -81,6 +81,10 @@ HYPERCORE_PENDING_READERS: dict[ChainId, ChecksumAddress] = {
81
81
  WAD_DECIMALS = 18
82
82
  #: ``accountMarginSummary`` reports USD with 6 decimals.
83
83
  USD6_DECIMALS = 6
84
+ #: The most decimals a perp price can carry: Hyperliquid's ``MAX_DECIMALS``,
85
+ #: which is 6 for perps (8 for spot). A perp's price has
86
+ #: ``PERP_MAX_DECIMALS - szDecimals`` decimals (:func:`perp_px_decimals`).
87
+ PERP_MAX_DECIMALS = 6
84
88
  _INT256_MAX = (1 << 255) - 1
85
89
 
86
90
 
@@ -111,6 +115,16 @@ def _validate_uint(value: int, bits: int, name: str) -> None:
111
115
  raise ValueError(f"{name} must fit in uint{bits}, got {value}")
112
116
 
113
117
 
118
+ def perp_px_decimals(sz_decimals: Decimals) -> Decimals:
119
+ """Decimals of a perp's :meth:`HyperCoreReader.mark_px` and
120
+ :meth:`HyperCoreReader.oracle_px`, from its ``szDecimals``."""
121
+ if not 0 <= sz_decimals <= PERP_MAX_DECIMALS:
122
+ raise ValueError(
123
+ f"sz_decimals must be in 0..{PERP_MAX_DECIMALS}, got {sz_decimals}"
124
+ )
125
+ return Decimals(PERP_MAX_DECIMALS - sz_decimals)
126
+
127
+
114
128
  @dataclass(frozen=True, slots=True)
115
129
  class HyperCoreSpotBalance:
116
130
  """``spotBalance`` precompile result, all in Core wei of the token."""
@@ -306,10 +320,12 @@ class HyperCoreReader:
306
320
  return self._read(WITHDRAWABLE_PRECOMPILE, ["address"], [user], ["uint64"])
307
321
 
308
322
  def oracle_px(self, read_index: int) -> Call[int]:
323
+ """A perp's oracle price, with :func:`perp_px_decimals` decimals."""
309
324
  _validate_uint(read_index, 32, "read_index")
310
325
  return self._read(ORACLE_PX_PRECOMPILE, ["uint32"], [read_index], ["uint64"])
311
326
 
312
327
  def mark_px(self, read_index: int) -> Call[int]:
328
+ """A perp's mark price, with :func:`perp_px_decimals` decimals."""
313
329
  _validate_uint(read_index, 32, "read_index")
314
330
  return self._read(MARK_PX_PRECOMPILE, ["uint32"], [read_index], ["uint64"])
315
331
 
@@ -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
@@ -29,6 +29,7 @@ from ipor_fusion.hypercore import (
29
29
  HyperCoreSpotBalance,
30
30
  HyperCoreTokenInfo,
31
31
  convert_to_wad_int,
32
+ perp_px_decimals,
32
33
  read_hypercore_nav,
33
34
  )
34
35
  from ipor_fusion.readers.hypercore import (
@@ -335,6 +336,17 @@ def test_convert_to_wad_int_rounds_like_ipor_math(value, decimals, expected):
335
336
  assert convert_to_wad_int(value, decimals) == expected
336
337
 
337
338
 
339
+ @pytest.mark.parametrize(("sz_decimals", "expected"), [(0, 6), (5, 1), (6, 0)])
340
+ def test_perp_px_decimals(sz_decimals, expected):
341
+ assert perp_px_decimals(sz_decimals) == expected
342
+
343
+
344
+ @pytest.mark.parametrize("sz_decimals", [-1, 7])
345
+ def test_perp_px_decimals_rejects_out_of_range(sz_decimals):
346
+ with pytest.raises(ValueError, match="sz_decimals"):
347
+ perp_px_decimals(sz_decimals)
348
+
349
+
338
350
  def _universal_read(data: bytes) -> bytes:
339
351
  """`PlasmaVault.read` double: the pending reader or the balance fuse."""
340
352
  target, inner = decode(["address", "bytes"], data[4:])
@@ -516,10 +516,13 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
516
516
  "HyperCoreTransferStatus",
517
517
  "HyperCoreVaultState",
518
518
  "MarginTableId",
519
+ "ORDER_DECIMALS",
520
+ "PERP_MAX_DECIMALS",
519
521
  "PayloadHash",
520
522
  "SPOT_DEX",
521
523
  "TimeInForce",
522
524
  "TransferDirection",
525
+ "USD6_DECIMALS",
523
526
  "USDC_SYSTEM_ADDRESS",
524
527
  "USDC_TOKEN_INDEX",
525
528
  "compare_hypercore_transfer",
@@ -532,6 +535,7 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
532
535
  "is_hip3_asset",
533
536
  "is_native_perp_asset",
534
537
  "perp_dex_of",
538
+ "perp_px_decimals",
535
539
  "precompile_index_of",
536
540
  "read_hypercore_evm_exit_ceiling",
537
541
  "read_hypercore_nav",