ipor-fusion 4.0.0.dev120__tar.gz → 4.0.0.dev122__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 (297) hide show
  1. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/AGENTS.md +4 -3
  2. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/MIGRATION_4.md +6 -5
  3. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/PKG-INFO +1 -1
  4. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/pyproject.toml +1 -1
  5. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/validation.py +4 -3
  6. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_data.py +4 -2
  7. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_validation.py +50 -23
  8. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.claude-plugin/marketplace.json +0 -0
  9. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.claude-plugin/plugin.json +0 -0
  10. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.env.example +0 -0
  11. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.gemini/settings.json +0 -0
  12. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.git-blame-ignore-revs +0 -0
  13. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/cd.yml +0 -0
  14. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/ci.yml +0 -0
  15. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/commit-lint.yml +0 -0
  16. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/notify-slack.yml +0 -0
  17. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/python-build.yml +0 -0
  18. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/python-publish.yml +0 -0
  19. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/release.yml +0 -0
  20. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.github/workflows/report-slack.yml +0 -0
  21. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.gitignore +0 -0
  22. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.mcp.json +0 -0
  23. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.pre-commit-config.yaml +0 -0
  24. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/.python-version +0 -0
  25. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CHANGELOG.md +0 -0
  26. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CLAUDE.md +0 -0
  27. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/CODEOWNERS +0 -0
  28. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/LICENSE +0 -0
  29. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/README.md +0 -0
  30. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/build.sh +0 -0
  31. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/CONTRIBUTING.md +0 -0
  32. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/README.md +0 -0
  33. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  34. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  35. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  36. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  37. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/external_state_margin_leg_base.py +0 -0
  38. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/examples/simple_aave_v3_supply_base.py +0 -0
  39. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/pytest.ini +0 -0
  40. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/scripts/commit-check.sh +0 -0
  41. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/scripts/crosschain_readiness.py +0 -0
  42. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/skills/ipor-deploy-vault/SKILL.md +0 -0
  43. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/__init__.py +0 -0
  44. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/about.py +0 -0
  45. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cache.py +0 -0
  46. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/chains.py +0 -0
  47. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/__init__.py +0 -0
  48. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  49. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/config_cmd.py +0 -0
  50. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/config_store.py +0 -0
  51. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/main.py +0 -0
  52. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/market_cmd.py +0 -0
  53. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/options.py +0 -0
  54. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  55. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  56. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_health.py +0 -0
  57. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  58. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  59. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  60. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/config/__init__.py +0 -0
  61. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/config/roles.py +0 -0
  62. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/__init__.py +0 -0
  63. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/access.py +0 -0
  64. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/address.py +0 -0
  65. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/context.py +0 -0
  66. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/contract.py +0 -0
  67. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/erc20.py +0 -0
  68. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/external_state_executor.py +0 -0
  69. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fee_manager.py +0 -0
  70. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fuse.py +0 -0
  71. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fuse_action.py +0 -0
  72. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/fusion_factory.py +0 -0
  73. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/logs.py +0 -0
  74. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/multicall.py +0 -0
  75. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/oracle.py +0 -0
  76. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/plasma_vault.py +0 -0
  77. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/rewards_manager.py +0 -0
  78. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/simulation.py +0 -0
  79. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  80. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/__init__.py +0 -0
  81. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  82. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  83. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  84. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  85. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  86. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  87. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  88. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  89. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  90. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/contracts.py +0 -0
  91. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/discovery.py +0 -0
  92. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/errors.py +0 -0
  93. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  94. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  95. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  96. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  97. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/lane.py +0 -0
  98. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/logs.py +0 -0
  99. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/messages.py +0 -0
  100. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/simulation.py +0 -0
  101. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  102. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  103. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  104. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  105. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  106. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/crosschain/transport.py +0 -0
  107. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/dependency_graph.py +0 -0
  108. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/entry_cli.py +0 -0
  109. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/entry_mcp.py +0 -0
  110. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/errors.py +0 -0
  111. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/explorer.py +0 -0
  112. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/field_docs.py +0 -0
  113. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/__init__.py +0 -0
  114. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  115. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/async_action.py +0 -0
  116. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/base.py +0 -0
  117. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  118. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/erc4626.py +0 -0
  119. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  120. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/events.py +0 -0
  121. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state.py +0 -0
  122. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/external_state_events.py +0 -0
  123. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  124. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  125. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/hypercore.py +0 -0
  126. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
  127. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/merkl.py +0 -0
  128. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/morpho.py +0 -0
  129. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  130. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  131. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/fuses/universal.py +0 -0
  132. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/__init__.py +0 -0
  133. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/architecture.md +0 -0
  134. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/glossary.md +0 -0
  135. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/invariants.md +0 -0
  136. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/guide/quickstart.md +0 -0
  137. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/market_ids.py +0 -0
  138. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/market_info.py +0 -0
  139. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/__init__.py +0 -0
  140. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/guide.py +0 -0
  141. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/models.py +0 -0
  142. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/mcp/server.py +0 -0
  143. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/morpho_api.py +0 -0
  144. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/py.typed +0 -0
  145. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/__init__.py +0 -0
  146. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/aave_v3.py +0 -0
  147. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/aave_v4.py +0 -0
  148. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/compound_v3.py +0 -0
  149. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/hypercore.py +0 -0
  150. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  151. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/lending_health.py +0 -0
  152. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/morpho.py +0 -0
  153. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  154. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  155. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  156. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/position_manager.py +0 -0
  157. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  158. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  159. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/readers/unpriceable.py +0 -0
  160. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/substrates.py +0 -0
  161. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/types.py +0 -0
  162. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_erc20.py +0 -0
  163. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_info.py +0 -0
  164. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_managers.py +0 -0
  165. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_positions.py +0 -0
  166. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/src/ipor_fusion/vault_reads.py +0 -0
  167. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/UniswapV3UniversalRouter.py +0 -0
  168. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain.py +0 -0
  169. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain_lifecycle.py +0 -0
  170. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_crosschain_recovery.py +0 -0
  171. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_euler_v2.py +0 -0
  172. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_foundry.py +0 -0
  173. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_guide.py +0 -0
  174. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_hypercore_model.py +0 -0
  175. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_hypercore_shadow.py +0 -0
  176. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_multicall.py +0 -0
  177. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_simulate.py +0 -0
  178. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/_validation.py +0 -0
  179. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/addresses.py +0 -0
  180. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/conftest.py +0 -0
  181. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/constants.py +0 -0
  182. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  183. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/hypercore_market55.json +0 -0
  184. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/clean.json +0 -0
  185. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  186. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/rich.json +0 -0
  187. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  188. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_about.py +0 -0
  189. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_access_manager.py +0 -0
  190. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cache.py +0 -0
  191. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_chains.py +0 -0
  192. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_changelog.py +0 -0
  193. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_commands.py +0 -0
  194. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_config_store.py +0 -0
  195. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_helpers.py +0 -0
  196. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_hypercore.py +0 -0
  197. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_lending_health.py +0 -0
  198. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_market_morpho_blue.py +0 -0
  199. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_oracle_mapping.py +0 -0
  200. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_pending_requests_scan.py +0 -0
  201. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_role_accounts.py +0 -0
  202. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_info_golden.py +0 -0
  203. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_predates_getters.py +0 -0
  204. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_cli_vault_validate.py +0 -0
  205. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_contract_call.py +0 -0
  206. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_contract_encoder.py +0 -0
  207. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_events.py +0 -0
  208. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_indexer.py +0 -0
  209. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_ccip_quote.py +0 -0
  210. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_chainlink.py +0 -0
  211. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_contracts.py +0 -0
  212. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_encoding.py +0 -0
  213. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_errors.py +0 -0
  214. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_lane.py +0 -0
  215. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_layering.py +0 -0
  216. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_readiness.py +0 -0
  217. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_readiness_report.py +0 -0
  218. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_crosschain_transport.py +0 -0
  219. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_erc20.py +0 -0
  220. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_error_hierarchy.py +0 -0
  221. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_composed_hypercore.py +0 -0
  222. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_crosschain.py +0 -0
  223. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  224. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_examples_vaults.py +0 -0
  225. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_explorer.py +0 -0
  226. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_external_state_events.py +0 -0
  227. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_external_state_executor.py +0 -0
  228. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fee_manager.py +0 -0
  229. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fuse_encoding.py +0 -0
  230. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_fusion_instance.py +0 -0
  231. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_guide.py +0 -0
  232. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_deployment.py +0 -0
  233. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_events.py +0 -0
  234. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_flow.py +0 -0
  235. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_live.py +0 -0
  236. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_outcome.py +0 -0
  237. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_readers.py +0 -0
  238. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_hypercore_simulation.py +0 -0
  239. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_logs.py +0 -0
  240. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_hypercore.py +0 -0
  241. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_models.py +0 -0
  242. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_server.py +0 -0
  243. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_mcp_vault_validate.py +0 -0
  244. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_multicall.py +0 -0
  245. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_oracle.py +0 -0
  246. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_oracle_mapping.py +0 -0
  247. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_plasma_vault.py +0 -0
  248. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_public_api.py +0 -0
  249. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_reader_encoding.py +0 -0
  250. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_readiness_selection.py +0 -0
  251. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_revert_decoding.py +0 -0
  252. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_rewards_manager.py +0 -0
  253. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_roles.py +0 -0
  254. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_sdk_layering.py +0 -0
  255. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  256. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  257. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  258. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_canary.py +0 -0
  259. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_hypercore.py +0 -0
  260. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  261. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  262. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  263. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  264. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  265. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  266. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  267. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_arbitrum.py +0 -0
  268. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_base.py +0 -0
  269. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_examples_crosschain.py +0 -0
  270. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_external_state_executor_base.py +0 -0
  271. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  272. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  273. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  274. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_morpho_blue.py +0 -0
  275. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v3.py +0 -0
  276. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  277. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  278. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  279. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  280. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_readers_integration.py +0 -0
  281. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_release_funds.py +0 -0
  282. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_swap_on_base.py +0 -0
  283. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  284. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_solidity_compiler.py +0 -0
  285. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_solidity_mirrors.py +0 -0
  286. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_substrates.py +0 -0
  287. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_types_and_events.py +0 -0
  288. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_unpriceable_tokens.py +0 -0
  289. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_dep_graph.py +0 -0
  290. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_info_onchain_base.py +0 -0
  291. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  292. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_vault_simulator_blocks.py +0 -0
  293. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_web3_context.py +0 -0
  294. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/test_withdraw_manager.py +0 -0
  295. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/typed_client/consumer.py +0 -0
  296. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/tests/typed_client/rejected.py +0 -0
  297. {ipor_fusion-4.0.0.dev120 → ipor_fusion-4.0.0.dev122}/uv.lock +0 -0
@@ -429,9 +429,10 @@ are not validated.
429
429
  everything validation and the ``vault info`` document need, so neither reads the
430
430
  chain. The chain is `ctx.chain_id`; ``lending=False`` skips lending health, the
431
431
  position breakdowns, their prices and the unpriceable check; ``metadata=False``
432
- reads no token symbol or decimals at all (`validate_vault`'s default), and
433
- ``metadata=True`` reads them in one cached Multicall3 batch that also names the
434
- ERC20 holdings. Add a new chain-state input to the snapshot, never a
432
+ (`validate_vault`'s default) skips the display metadata (`token_symbols`,
433
+ `token_decimals`, the ERC20 holdings' symbols) but not the asset's symbol and
434
+ decimals or the decimals valuation needs; ``metadata=True`` reads it in one cached
435
+ Multicall3 batch that also names the ERC20 holdings. Add a new chain-state input to the snapshot, never a
435
436
  read inside a renderer or validator.
436
437
  - PlasmaVault serves governance/view functions via `fallback()` delegatecall to
437
438
  PlasmaVaultBase, so Etherscan's ABI for the vault address omits callable
@@ -65,14 +65,15 @@ chain is always the context's:
65
65
  the vault address (not a `PlasmaVault`) and no `chain_id`. It resolves one block
66
66
  (``block``, else a numeric `ctx.default_block`, else the latest) and runs every
67
67
  read, log scans included, on `ctx.at_block(block)`; `ctx` is not modified. The old
68
- ``chain_id=0`` switch is ``lending=False``; ``metadata=False`` reads no token
69
- symbol or decimals (the ERC20 holdings' symbols are then `"?"`), and with
70
- ``metadata=True`` the holdings are named by the same cached, batched read as
71
- `token_symbols`. `VaultData` gains `vault`, `chain_id`, `market_balances`, `erc20`,
68
+ ``chain_id=0`` switch is ``lending=False``; ``metadata=False`` skips the
69
+ display metadata: `token_symbols` and `token_decimals` stay empty and the ERC20
70
+ holdings' symbols are `"?"`. The underlying asset's symbol and decimals and the
71
+ decimals the valuation needs are still read. With ``metadata=True`` the holdings
72
+ are named by the same cached, batched read as `token_symbols`. `VaultData` gains `vault`, `chain_id`, `market_balances`, `erc20`,
72
73
  `token_symbols` and `token_decimals`; `WithdrawManagerData` gains
73
74
  `shares_to_release_assets` and `pending_request_assets`.
74
75
  - `validate_vault(ctx, vault, *, block=None, metadata=False)` fetches (by default
75
- without token metadata) and validates; it no longer takes ``resolve_symbol``.
76
+ without display metadata) and validates; it no longer takes ``resolve_symbol``.
76
77
  ``metadata=True`` names the ERC20 holdings in the result and its findings. `validate_vault_state(state)` is
77
78
  pure: a custom `VaultState` also provides `vault`, `chain_id`, `market_balances`,
78
79
  `erc20` and the queue's `shares_to_release_assets`. `read_erc20_holdings` is gone:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev120
3
+ Version: 4.0.0.dev122
4
4
  Summary: The IPOR Fusion SDK for Python
5
5
  Project-URL: homepage, https://ipor.io
6
6
  Project-URL: repository, https://github.com/IPOR-Labs/ipor-fusion.py
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.0.0.dev120"
3
+ version = "4.0.0.dev122"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -245,9 +245,10 @@ def validate_vault(
245
245
  else the context's numeric default block, else the latest) and validate
246
246
  it; ``ctx`` itself is not modified.
247
247
 
248
- The checks need no token metadata, so none is read by default and the
249
- ERC20 holdings are named ``"?"``; ``metadata=True`` adds one batched,
250
- cached symbol read that names them in the holdings and findings."""
248
+ The checks need no display metadata, so by default the snapshot has no
249
+ `token_symbols` / `token_decimals` and the ERC20 holdings are named
250
+ ``"?"``; ``metadata=True`` adds one batched, cached read that names them
251
+ in the holdings and findings."""
251
252
  return validate_vault_state(
252
253
  fetch_vault_data(ctx, vault, block=block, metadata=metadata)
253
254
  )
@@ -549,8 +549,10 @@ def fetch_vault_data(
549
549
  ``lending=False`` skips lending health, the Morpho / Aave position
550
550
  breakdowns, their token prices and the unpriceable-token check.
551
551
  ``metadata=False`` skips the token symbols and decimals the ``vault info``
552
- document shows (validation does not need them) and reads no symbol at all:
553
- the ERC20 holdings are then named ``"?"``.
552
+ document shows (validation does not need them): `token_symbols` and
553
+ `token_decimals` stay empty and the ERC20 holdings are named ``"?"``. The
554
+ underlying asset's symbol and decimals and the decimals the valuation needs
555
+ are read either way.
554
556
 
555
557
  Raises `UnsupportedChainError` on a chain the tooling is not validated on
556
558
  and `UnsupportedVaultVersionError` when the vault predates a getter the
@@ -8,7 +8,6 @@ depends on the CLI's fetch types.
8
8
  from __future__ import annotations
9
9
 
10
10
  import dataclasses
11
- from concurrent.futures import ThreadPoolExecutor
12
11
  from dataclasses import dataclass, field, replace
13
12
  from typing import Any
14
13
  from unittest.mock import MagicMock, patch
@@ -30,13 +29,14 @@ from ipor_fusion import (
30
29
  VaultValidation,
31
30
  Web3Context,
32
31
  validate_vault,
32
+ vault_data,
33
33
  )
34
34
  from ipor_fusion.cache import NullCache
35
35
  from ipor_fusion.core.oracle import price_oracle_middleware
36
36
  from ipor_fusion.market_ids import IporFusionMarkets
37
37
  from ipor_fusion.types import ChainId, MarketId
38
38
  from ipor_fusion.validation import GET_MARKET_SUBSTRATES, Reconciliation
39
- from ipor_fusion.vault_data import _derived_reads, _MarketReads
39
+ from ipor_fusion.vault_data import VaultData, _MarketReads
40
40
  from ipor_fusion.vault_erc20 import _Asset, _erc20_holdings, _read_erc20_market
41
41
 
42
42
 
@@ -444,10 +444,12 @@ class TestReadErc20Holdings:
444
444
 
445
445
 
446
446
  class TestSnapshotTokenMetadata:
447
- """`fetch_vault_data`'s ERC20 holdings and token metadata, from the
448
- vault and market reads on."""
447
+ """`fetch_vault_data`'s optional token metadata. The vault, fee, queue,
448
+ role and market pipelines (the underlying asset's symbol and decimals
449
+ among them) are stubbed; the ERC20 market and the metadata batch run on
450
+ the fake chain, whose code reads raise."""
449
451
 
450
- def _derive(self, *, metadata: bool) -> tuple[_Chain, dict[str, Any]]:
452
+ def _fetch(self, *, metadata: bool) -> tuple[_Chain, VaultData]:
451
453
  state = _erc20_state()
452
454
  chain = _Chain()
453
455
  ctx = Web3Context(chain.web3(), ChainId(1), cache=NullCache())
@@ -459,44 +461,69 @@ class TestSnapshotTokenMetadata:
459
461
  market_balances=chain.market_balances, # type: ignore[arg-type]
460
462
  )
461
463
  vault_reads = {
464
+ "share_decimals": 18,
465
+ "total_assets": state.total_assets,
466
+ "total_supply": state.total_assets,
467
+ "supply_cap": state.total_assets,
462
468
  "asset": ASSET,
469
+ "access_manager": _addr("ac"),
470
+ "price_oracle": ORACLE,
471
+ "fuses": [FUSE],
472
+ "instant_fuses": [],
473
+ "vault_name": "Vault",
474
+ "rewards_manager": None,
463
475
  "asset_decimals": state.asset_decimals,
476
+ "underlying_balance_on_vault": state.underlying_balance_on_vault,
477
+ "asset_symbol": "USDC",
464
478
  "asset_price_usd": state.asset_price_usd,
479
+ "fuse_markets": None,
480
+ "unimplemented_getters": [],
465
481
  }
466
- with ThreadPoolExecutor() as pool:
467
- fields = _derived_reads(
482
+ oracle = price_oracle_middleware(ctx, ORACLE) # type: ignore[arg-type]
483
+ with (
484
+ patch.object(vault_data, "_block_timestamp", return_value=1),
485
+ patch.object(
486
+ vault_data, "_fetch_vault_reads", return_value=(vault_reads, oracle)
487
+ ),
488
+ patch.object(vault_data, "_fetch_fee_data", return_value=None),
489
+ patch.object(
490
+ vault_data, "_fetch_withdraw_manager", return_value=(None, None)
491
+ ),
492
+ patch.object(vault_data, "_fetch_role_accounts", return_value=None),
493
+ patch.object(vault_data, "_fetch_market_reads", return_value=markets),
494
+ patch.object(vault_data, "_fetch_hypercore_state", return_value=None),
495
+ ):
496
+ data = vault_data.fetch_vault_data(
468
497
  ctx,
469
- pool,
470
498
  VAULT, # type: ignore[arg-type]
471
- vault_reads,
472
- price_oracle_middleware(ctx, ORACLE), # type: ignore[arg-type]
473
- markets,
474
- None,
499
+ block=123,
500
+ lending=False,
475
501
  metadata=metadata,
476
502
  )
477
- return chain, fields
503
+ return chain, data
478
504
 
479
- def test_without_metadata_no_symbol_is_read(self):
480
- chain, fields = self._derive(metadata=False)
505
+ def test_without_metadata_no_token_symbol_is_read(self):
506
+ chain, data = self._fetch(metadata=False)
481
507
 
482
508
  assert chain.symbol_reads == 0
483
- assert "token_symbols" not in fields
484
- erc20 = fields["erc20"]
485
- assert [t.symbol for t in erc20.tokens] == ["?", "?", "?"]
486
- assert erc20.value_in_asset == 11 * WAD
509
+ assert (data.token_symbols, data.token_decimals) == ({}, {})
510
+ assert [t.symbol for t in data.erc20.tokens] == ["?", "?", "?"]
511
+ assert [t.decimals for t in data.erc20.tokens] == [18, 18, 18]
512
+ assert data.erc20.value_in_asset == 11 * WAD
513
+ assert data.asset_symbol == "USDC"
487
514
 
488
515
  def test_metadata_names_the_holdings_in_one_batch(self):
489
- chain, fields = self._derive(metadata=True)
516
+ chain, data = self._fetch(metadata=True)
490
517
 
491
- without, _ = self._derive(metadata=False)
518
+ without, _ = self._fetch(metadata=False)
492
519
  assert chain.symbol_reads == 3
493
520
  assert len(chain.blocks) == len(without.blocks) + 1
494
- assert fields["token_symbols"] == {
521
+ assert data.token_symbols == {
495
522
  ASSET.lower(): "",
496
523
  TOKEN.lower(): "TKN",
497
524
  OTHER.lower(): "",
498
525
  }
499
- assert [t.symbol for t in fields["erc20"].tokens] == ["?", "TKN", "?"]
526
+ assert [t.symbol for t in data.erc20.tokens] == ["?", "TKN", "?"]
500
527
 
501
528
 
502
529
  class TestValidateVault: