ipor-fusion 4.2.0.dev9__tar.gz → 4.2.0.dev11__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 (370) hide show
  1. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/PKG-INFO +2 -2
  2. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/README.md +1 -1
  3. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/pyproject.toml +1 -1
  4. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/__init__.py +4 -0
  5. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/__init__.py +7 -1
  6. ipor_fusion-4.2.0.dev11/src/ipor_fusion/fuses/compound_v3.py +62 -0
  7. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/market_ids.py +4 -0
  8. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/compound_v3.py +11 -0
  9. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/lending_health.py +1 -0
  10. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/substrates.py +1 -0
  11. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/constants.py +18 -0
  12. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_lending_health.py +1 -0
  13. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fuse_encoding.py +37 -1
  14. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_public_api.py +4 -0
  15. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_reader_encoding.py +8 -0
  16. ipor_fusion-4.2.0.dev11/tests/test_simulate_compound_v3_institutional_usdc.py +453 -0
  17. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_solidity_mirrors.py +2 -3
  18. ipor_fusion-4.2.0.dev9/src/ipor_fusion/fuses/compound_v3.py +0 -23
  19. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.claude-plugin/marketplace.json +0 -0
  20. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.claude-plugin/plugin.json +0 -0
  21. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.env.example +0 -0
  22. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.gemini/settings.json +0 -0
  23. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.git-blame-ignore-revs +0 -0
  24. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/cd.yml +0 -0
  25. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/ci.yml +0 -0
  26. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/commit-lint.yml +0 -0
  27. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/notify-slack.yml +0 -0
  28. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/python-build.yml +0 -0
  29. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/python-publish.yml +0 -0
  30. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/release.yml +0 -0
  31. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.github/workflows/report-slack.yml +0 -0
  32. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.gitignore +0 -0
  33. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.mcp.json +0 -0
  34. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.pre-commit-config.yaml +0 -0
  35. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/.python-version +0 -0
  36. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/AGENTS.md +0 -0
  37. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/CHANGELOG.md +0 -0
  38. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/CLAUDE.md +0 -0
  39. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/CODEOWNERS +0 -0
  40. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/LICENSE +0 -0
  41. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/MIGRATION_4.md +0 -0
  42. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/build.sh +0 -0
  43. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/CONTRIBUTING.md +0 -0
  44. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/README.md +0 -0
  45. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  46. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  47. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  48. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/external_state_margin_leg_base.py +0 -0
  49. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/hypercore_vault_official_deployment_hyperevm.py +0 -0
  50. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/examples/simple_aave_v3_supply_base.py +0 -0
  51. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/pytest.ini +0 -0
  52. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/scripts/commit-check.sh +0 -0
  53. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/scripts/fusion_error_signatures.py +0 -0
  54. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/skills/ipor-deploy-vault/SKILL.md +0 -0
  55. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/about.py +0 -0
  56. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cache.py +0 -0
  57. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/chains.py +0 -0
  58. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/__init__.py +0 -0
  59. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/address_cmd.py +0 -0
  60. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  61. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/config_cmd.py +0 -0
  62. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/config_store.py +0 -0
  63. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/fuse_cmd.py +0 -0
  64. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/main.py +0 -0
  65. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/market_cmd.py +0 -0
  66. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/options.py +0 -0
  67. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  68. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/preflight_cmd.py +0 -0
  69. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  70. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/vault_health.py +0 -0
  71. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  72. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  73. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  74. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/config/__init__.py +0 -0
  75. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/config/roles.py +0 -0
  76. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/__init__.py +0 -0
  77. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/access.py +0 -0
  78. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/address.py +0 -0
  79. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/context.py +0 -0
  80. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/context_manager.py +0 -0
  81. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/contract.py +0 -0
  82. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/erc20.py +0 -0
  83. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/external_state_executor.py +0 -0
  84. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/fee_manager.py +0 -0
  85. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/fuse.py +0 -0
  86. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/fuse_action.py +0 -0
  87. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/fuse_decoding.py +0 -0
  88. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/fusion_factory.py +0 -0
  89. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/logs.py +0 -0
  90. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/multicall.py +0 -0
  91. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/oracle.py +0 -0
  92. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/plasma_vault.py +0 -0
  93. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/rewards_manager.py +0 -0
  94. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/simulation.py +0 -0
  95. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/simulation_result.py +0 -0
  96. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  97. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/__init__.py +0 -0
  98. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  99. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/chainlink.py +0 -0
  100. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/codec.py +0 -0
  101. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/contracts.py +0 -0
  102. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  103. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/indexer.py +0 -0
  104. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  105. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  106. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  107. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/contracts.py +0 -0
  108. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/discovery.py +0 -0
  109. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/errors.py +0 -0
  110. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/fuses/__init__.py +0 -0
  111. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/fuses/base.py +0 -0
  112. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/fuses/ccip.py +0 -0
  113. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/fuses/stargate.py +0 -0
  114. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/lane.py +0 -0
  115. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/logs.py +0 -0
  116. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/messages.py +0 -0
  117. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/simulation.py +0 -0
  118. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  119. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/stargate/contracts.py +0 -0
  120. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  121. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/stargate/layerzero.py +0 -0
  122. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/stargate/transport.py +0 -0
  123. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/crosschain/transport.py +0 -0
  124. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/dependency_graph.py +0 -0
  125. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/entry_cli.py +0 -0
  126. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/entry_mcp.py +0 -0
  127. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/errors.py +0 -0
  128. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/explorer.py +0 -0
  129. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/field_docs.py +0 -0
  130. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuse_whitelist.py +0 -0
  131. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  132. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/async_action.py +0 -0
  133. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/base.py +0 -0
  134. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/erc4626.py +0 -0
  135. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  136. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/events.py +0 -0
  137. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/external_state.py +0 -0
  138. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/external_state_event_decoding.py +0 -0
  139. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  140. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  141. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/hypercore.py +0 -0
  142. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/hypercore_event_decoding.py +0 -0
  143. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/hypercore_pre_hooks.py +0 -0
  144. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/merkl.py +0 -0
  145. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/morpho.py +0 -0
  146. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  147. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  148. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fuses/universal.py +0 -0
  149. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/fusion_errors.py +0 -0
  150. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/guide/__init__.py +0 -0
  151. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/guide/architecture.md +0 -0
  152. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/guide/glossary.md +0 -0
  153. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/guide/invariants.md +0 -0
  154. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/guide/quickstart.md +0 -0
  155. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/hypercore/__init__.py +0 -0
  156. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/market_info.py +0 -0
  157. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/mcp/__init__.py +0 -0
  158. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/mcp/guide.py +0 -0
  159. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/mcp/models.py +0 -0
  160. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/mcp/server.py +0 -0
  161. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/morpho_api.py +0 -0
  162. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/onchain_text.py +0 -0
  163. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/preflight.py +0 -0
  164. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/py.typed +0 -0
  165. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/__init__.py +0 -0
  166. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/aave_v3.py +0 -0
  167. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/aave_v4.py +0 -0
  168. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/euler_v2.py +0 -0
  169. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/hypercore.py +0 -0
  170. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  171. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/morpho.py +0 -0
  172. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  173. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/oracle_mapping_nodes.py +0 -0
  174. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/oracle_mapping_reader.py +0 -0
  175. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/position_manager.py +0 -0
  176. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  177. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  178. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/readers/unpriceable.py +0 -0
  179. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/registry.py +0 -0
  180. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/types.py +0 -0
  181. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/validation.py +0 -0
  182. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_data.py +0 -0
  183. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_erc20.py +0 -0
  184. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_info.py +0 -0
  185. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_managers.py +0 -0
  186. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_positions.py +0 -0
  187. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/src/ipor_fusion/vault_reads.py +0 -0
  188. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/UniswapV3UniversalRouter.py +0 -0
  189. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_addresses.py +0 -0
  190. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_crosschain.py +0 -0
  191. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_crosschain_lifecycle.py +0 -0
  192. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_crosschain_recovery.py +0 -0
  193. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_euler_v2.py +0 -0
  194. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_event_args.py +0 -0
  195. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_fake_rpc.py +0 -0
  196. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_foundry.py +0 -0
  197. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_golden.py +0 -0
  198. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_guide.py +0 -0
  199. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_hypercore_model.py +0 -0
  200. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_hypercore_shadow.py +0 -0
  201. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_live.py +0 -0
  202. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_multicall.py +0 -0
  203. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_oracle_mapping_fake.py +0 -0
  204. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_simulate.py +0 -0
  205. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/_validation.py +0 -0
  206. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/addresses.py +0 -0
  207. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/conftest.py +0 -0
  208. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  209. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/hypercore_market55.json +0 -0
  210. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/hypercore_official.json +0 -0
  211. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/meta_morpho_v1.json +0 -0
  212. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/meta_morpho_v1.mcp.json +0 -0
  213. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/meta_morpho_v2.json +0 -0
  214. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/meta_morpho_v2.mcp.json +0 -0
  215. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_api/market.json +0 -0
  216. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_api/vault_v1.json +0 -0
  217. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_api/vault_v2.json +0 -0
  218. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_api/vault_v2_not_found.json +0 -0
  219. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue.json +0 -0
  220. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue.mcp.json +0 -0
  221. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue_api_error.json +0 -0
  222. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue_api_error.mcp.json +0 -0
  223. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue_no_api.json +0 -0
  224. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/market_golden/morpho_blue_no_api.mcp.json +0 -0
  225. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/oracle_mapping_golden/mapping.json +0 -0
  226. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/oracle_mapping_golden/mapping.mcp.json +0 -0
  227. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/simulate_v1_request.json +0 -0
  228. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/clean.json +0 -0
  229. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/clean.mcp.json +0 -0
  230. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  231. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/deployment_error.json +0 -0
  232. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/deployment_error.mcp.json +0 -0
  233. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/deployment_error.txt +0 -0
  234. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/fetched.cli.json +0 -0
  235. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/fetched.json +0 -0
  236. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/fetched.mcp.json +0 -0
  237. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/full.json +0 -0
  238. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/full.mcp.json +0 -0
  239. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/full.txt +0 -0
  240. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/rich.json +0 -0
  241. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/rich.mcp.json +0 -0
  242. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  243. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_about.py +0 -0
  244. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_access_manager.py +0 -0
  245. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_addresses_helper.py +0 -0
  246. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cache.py +0 -0
  247. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_ccip_read_disabled.py +0 -0
  248. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_chains.py +0 -0
  249. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_address.py +0 -0
  250. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_changelog.py +0 -0
  251. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_commands.py +0 -0
  252. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_config_store.py +0 -0
  253. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_helpers.py +0 -0
  254. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_hypercore.py +0 -0
  255. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_market_golden.py +0 -0
  256. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_market_morpho_blue.py +0 -0
  257. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_mcp_fuse_whitelist.py +0 -0
  258. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_mcp_parity.py +0 -0
  259. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_oracle_mapping.py +0 -0
  260. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_oracle_mapping_golden.py +0 -0
  261. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_pending_requests_scan.py +0 -0
  262. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_preflight.py +0 -0
  263. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_role_accounts.py +0 -0
  264. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_vault_info_golden.py +0 -0
  265. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_vault_predates_getters.py +0 -0
  266. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_cli_vault_validate.py +0 -0
  267. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_contract_call.py +0 -0
  268. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_contract_encoder.py +0 -0
  269. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_ccip_events.py +0 -0
  270. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_ccip_indexer.py +0 -0
  271. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_ccip_quote.py +0 -0
  272. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_chainlink.py +0 -0
  273. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_contracts.py +0 -0
  274. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_encoding.py +0 -0
  275. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_errors.py +0 -0
  276. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_lane.py +0 -0
  277. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_layering.py +0 -0
  278. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_crosschain_transport.py +0 -0
  279. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_docs_typing.py +0 -0
  280. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_erc20.py +0 -0
  281. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_error_hierarchy.py +0 -0
  282. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_examples_crosschain.py +0 -0
  283. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  284. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_examples_hypercore_hyperevm.py +0 -0
  285. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_examples_vaults.py +0 -0
  286. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_explorer.py +0 -0
  287. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_external_state_events.py +0 -0
  288. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_external_state_executor.py +0 -0
  289. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fee_manager.py +0 -0
  290. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fuse_decoding.py +0 -0
  291. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fuse_whitelist.py +0 -0
  292. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fusion_errors.py +0 -0
  293. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_fusion_instance.py +0 -0
  294. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_governance_wrappers.py +0 -0
  295. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_guide.py +0 -0
  296. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_deployment.py +0 -0
  297. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_events.py +0 -0
  298. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_flow.py +0 -0
  299. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_live.py +0 -0
  300. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_outcome.py +0 -0
  301. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_pre_hooks.py +0 -0
  302. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_readers.py +0 -0
  303. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_hypercore_simulation.py +0 -0
  304. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_logs.py +0 -0
  305. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_address.py +0 -0
  306. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_hypercore.py +0 -0
  307. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_models.py +0 -0
  308. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_preflight.py +0 -0
  309. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_server.py +0 -0
  310. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_mcp_vault_validate.py +0 -0
  311. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_multicall.py +0 -0
  312. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_onchain_text.py +0 -0
  313. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_oracle.py +0 -0
  314. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_oracle_mapping.py +0 -0
  315. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_plasma_vault.py +0 -0
  316. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_preflight.py +0 -0
  317. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_public_type_reachability.py +0 -0
  318. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_registry.py +0 -0
  319. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_revert_decoding.py +0 -0
  320. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_rewards_manager.py +0 -0
  321. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_roles.py +0 -0
  322. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_sdk_layering.py +0 -0
  323. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  324. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  325. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  326. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  327. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  328. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  329. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  330. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  331. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  332. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_examples_arbitrum.py +0 -0
  333. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_examples_base.py +0 -0
  334. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_examples_crosschain.py +0 -0
  335. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_examples_hyperevm.py +0 -0
  336. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_external_state_executor_base.py +0 -0
  337. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  338. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  339. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  340. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_morpho_blue.py +0 -0
  341. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_pilot_v3.py +0 -0
  342. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  343. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  344. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  345. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  346. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_preflight_base.py +0 -0
  347. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_readers_integration.py +0 -0
  348. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_release_funds.py +0 -0
  349. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_swap_on_base.py +0 -0
  350. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_timelock_base.py +0 -0
  351. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  352. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulation_errors.py +0 -0
  353. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_simulation_observation.py +0 -0
  354. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_solidity_compiler.py +0 -0
  355. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_substrates.py +0 -0
  356. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_types_and_events.py +0 -0
  357. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_unpriceable_tokens.py +0 -0
  358. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_validation.py +0 -0
  359. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_data_block.py +0 -0
  360. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_dep_graph.py +0 -0
  361. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_info_fetched_golden.py +0 -0
  362. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_info_onchain_base.py +0 -0
  363. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  364. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_reconciliation_onchain_base.py +0 -0
  365. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_vault_simulator_blocks.py +0 -0
  366. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_web3_context.py +0 -0
  367. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/test_withdraw_manager.py +0 -0
  368. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/typed_client/consumer.py +0 -0
  369. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/tests/typed_client/rejected.py +0 -0
  370. {ipor_fusion-4.2.0.dev9 → ipor_fusion-4.2.0.dev11}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.2.0.dev9
3
+ Version: 4.2.0.dev11
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
@@ -520,7 +520,7 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
520
520
  | Euler V2 | `EulerV2SupplyFuse`, `EulerV2CollateralFuse`, `EulerV2ControllerFuse`, `EulerV2BorrowFuse`, `EulerV2BatchFuse`, `EulerV2SwapDeployFuse`, `EulerV2SwapReconfigureFuse`, `EulerV2SwapRegistryFuse` |
521
521
  | Uniswap V3 | `UniswapV3SwapFuse`, `UniswapV3NewPositionFuse`, `UniswapV3ModifyPositionFuse`, `UniswapV3CollectFuse` |
522
522
  | Ramses V2 | `RamsesV2NewPositionFuse`, `RamsesV2ModifyPositionFuse`, `RamsesV2CollectFuse`, `RamsesClaimFuse` |
523
- | Compound V3 | `CompoundV3SupplyFuse` |
523
+ | Compound V3 | `CompoundV3SupplyFuse`, `CompoundV3BorrowFuse`, `CompoundV3ClaimFuse` |
524
524
  | Gearbox V3 | `GearboxSupplyFuse`, `GearboxStakeFuse` |
525
525
  | ERC-4626 | `ERC4626SupplyFuse` |
526
526
  | Fluid Instadapp | `FluidInstadappSupplyFuse`, `FluidInstadappStakingFuse` |
@@ -471,7 +471,7 @@ Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> Call
471
471
  | Euler V2 | `EulerV2SupplyFuse`, `EulerV2CollateralFuse`, `EulerV2ControllerFuse`, `EulerV2BorrowFuse`, `EulerV2BatchFuse`, `EulerV2SwapDeployFuse`, `EulerV2SwapReconfigureFuse`, `EulerV2SwapRegistryFuse` |
472
472
  | Uniswap V3 | `UniswapV3SwapFuse`, `UniswapV3NewPositionFuse`, `UniswapV3ModifyPositionFuse`, `UniswapV3CollectFuse` |
473
473
  | Ramses V2 | `RamsesV2NewPositionFuse`, `RamsesV2ModifyPositionFuse`, `RamsesV2CollectFuse`, `RamsesClaimFuse` |
474
- | Compound V3 | `CompoundV3SupplyFuse` |
474
+ | Compound V3 | `CompoundV3SupplyFuse`, `CompoundV3BorrowFuse`, `CompoundV3ClaimFuse` |
475
475
  | Gearbox V3 | `GearboxSupplyFuse`, `GearboxStakeFuse` |
476
476
  | ERC-4626 | `ERC4626SupplyFuse` |
477
477
  | Fluid Instadapp | `FluidInstadappSupplyFuse`, `FluidInstadappStakingFuse` |
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "ipor-fusion"
3
- version = "4.2.0.dev9"
3
+ version = "4.2.0.dev11"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -171,6 +171,8 @@ from ipor_fusion.fuses import (
171
171
  AaveV3SupplyFuse,
172
172
  AsyncActionFuse,
173
173
  AsyncActionSubstrates,
174
+ CompoundV3BorrowFuse,
175
+ CompoundV3ClaimFuse,
174
176
  CompoundV3SupplyFuse,
175
177
  ERC4626SupplyFuse,
176
178
  EulerSwapDynamicParams,
@@ -656,6 +658,8 @@ __all__ = [
656
658
  "UniswapV3NewPositionEvent",
657
659
  "UniswapV3ClosePositionEvent",
658
660
  "UniswapV3Events",
661
+ "CompoundV3BorrowFuse",
662
+ "CompoundV3ClaimFuse",
659
663
  "CompoundV3SupplyFuse",
660
664
  "RamsesV2NewPositionFuse",
661
665
  "RamsesV2ModifyPositionFuse",
@@ -1,7 +1,11 @@
1
1
  from ipor_fusion.fuses.aave_v3 import AaveV3BorrowFuse, AaveV3SupplyFuse
2
2
  from ipor_fusion.fuses.async_action import AsyncActionFuse, AsyncActionSubstrates
3
3
  from ipor_fusion.fuses.base import Fuse, FuseAction, StakeFuse
4
- from ipor_fusion.fuses.compound_v3 import CompoundV3SupplyFuse
4
+ from ipor_fusion.fuses.compound_v3 import (
5
+ CompoundV3BorrowFuse,
6
+ CompoundV3ClaimFuse,
7
+ CompoundV3SupplyFuse,
8
+ )
5
9
  from ipor_fusion.fuses.erc4626 import ERC4626SupplyFuse
6
10
  from ipor_fusion.fuses.euler_v2 import (
7
11
  EulerSwapDynamicParams,
@@ -112,6 +116,8 @@ __all__ = [
112
116
  "UniswapV3NewPositionEvent",
113
117
  "UniswapV3ClosePositionEvent",
114
118
  "UniswapV3Events",
119
+ "CompoundV3BorrowFuse",
120
+ "CompoundV3ClaimFuse",
115
121
  "CompoundV3SupplyFuse",
116
122
  "RamsesV2NewPositionFuse",
117
123
  "RamsesV2ModifyPositionFuse",
@@ -0,0 +1,62 @@
1
+ from eth_typing import ChecksumAddress
2
+
3
+ from ipor_fusion.fuses.base import Fuse, FuseAction
4
+ from ipor_fusion.types import Amount
5
+
6
+
7
+ class CompoundV3SupplyFuse(Fuse):
8
+ """Fuse for supplying and withdrawing assets on Compound V3."""
9
+
10
+ SIGNATURES = (
11
+ "enter((address,uint256))",
12
+ "exit((address,uint256))",
13
+ )
14
+
15
+ def supply(self, *, asset: ChecksumAddress, amount: Amount) -> FuseAction:
16
+ self._validate_address(asset, "asset")
17
+ self._validate_amount(amount, "amount")
18
+ return self._action_raw("enter((address,uint256))", [[asset, amount]])
19
+
20
+ def withdraw(self, *, asset: ChecksumAddress, amount: Amount) -> FuseAction:
21
+ self._validate_address(asset, "asset")
22
+ self._validate_amount(amount, "amount")
23
+ return self._action_raw("exit((address,uint256))", [[asset, amount]])
24
+
25
+
26
+ class CompoundV3BorrowFuse(Fuse):
27
+ """Fuse for borrowing and repaying the base token of a Comet.
28
+
29
+ The fuse is bound to one Comet, whose base token is the only asset it can
30
+ borrow, so neither action names an asset; the base token must be granted as
31
+ a substrate of the fuse's market. A repay is capped at the debt, so
32
+ ``MAX_UINT256`` repays in full.
33
+ """
34
+
35
+ SIGNATURES = (
36
+ "enter((uint256))",
37
+ "exit((uint256))",
38
+ )
39
+
40
+ def borrow(self, *, amount: Amount) -> FuseAction:
41
+ self._validate_amount(amount, "amount")
42
+ return self._action_raw("enter((uint256))", [[amount]])
43
+
44
+ def repay(self, *, amount: Amount) -> FuseAction:
45
+ self._validate_amount(amount, "amount")
46
+ return self._action_raw("exit((uint256))", [[amount]])
47
+
48
+
49
+ class CompoundV3ClaimFuse(Fuse):
50
+ """Fuse for claiming a Comet's rewards to the vault's rewards claim manager.
51
+
52
+ The fuse is bound to one ``CometRewards``. Route the action through
53
+ ``RewardsManager.claim_rewards(...)``, not ``PlasmaVault.execute(...)``, and
54
+ register the fuse with ``RewardsManager.add_reward_fuses(...)`` first. A
55
+ Comet with no reward token configured reverts ``NotSupported(address)``.
56
+ """
57
+
58
+ SIGNATURES = ("claim(address)",)
59
+
60
+ def claim(self, *, comet: ChecksumAddress) -> FuseAction:
61
+ self._validate_address(comet, "comet")
62
+ return self._action_raw("claim(address)", [comet])
@@ -106,6 +106,10 @@ class IporFusionMarkets:
106
106
  # Substrate type: HyperCoreSubstrateLib (1 SpotToken, 2 PerpMarket,
107
107
  # 3 Destination, 4 Builder, 5 Config, 6 SendCap, 7 PerpPositionCap).
108
108
  HYPERCORE = MarketId(55)
109
+ # Compound V3 Institutional USDC (ciUSDCv3) on Ethereum: its own Comet, so
110
+ # the Compound V3 fuses are deployed again under this id; substrates: asset
111
+ # addresses, as for COMPOUND_V3_USDC
112
+ COMPOUND_V3_INSTITUTIONAL_USDC = MarketId(57)
109
113
  # POL unstaking via sPOLController. The out-of-band id is baked into the
110
114
  # deployed fuses as an immutable (424243 = 0x67933), so it must match the
111
115
  # deployments. Substrates per IporFusionMarkets.sol: the sPOLController
@@ -19,3 +19,14 @@ class CompoundV3Reader(ContractWrapper):
19
19
  output_types=["uint256"],
20
20
  decoder=Amount,
21
21
  )
22
+
23
+ def collateral_balance_of(
24
+ self, account: ChecksumAddress, asset: ChecksumAddress
25
+ ) -> Call[Amount]:
26
+ return self._view(
27
+ "collateralBalanceOf(address,address)",
28
+ account,
29
+ asset,
30
+ output_types=["uint128"],
31
+ decoder=Amount,
32
+ )
@@ -132,6 +132,7 @@ UNSUPPORTED_BORROW_MARKET_IDS = frozenset(
132
132
  IporFusionMarkets.MOONWELL,
133
133
  IporFusionMarkets.SILO_V2,
134
134
  IporFusionMarkets.EBISU,
135
+ IporFusionMarkets.COMPOUND_V3_INSTITUTIONAL_USDC,
135
136
  }
136
137
  )
137
138
  _UNSUPPORTED_REASON = "no lending health reader for this market"
@@ -527,6 +527,7 @@ _register_markets(
527
527
  37,
528
528
  44, # SPARK_LEND — reuses AaveV3SupplyFuse (isSubstrateAsAssetGranted)
529
529
  46, # NAPIER — isSubstrateAsAssetGranted, plain asset addresses
530
+ 57, # COMPOUND_V3_INSTITUTIONAL_USDC — same Compound V3 fuses as market 2
530
531
  *range(100_001, 100_021), # ERC4626_0001 .. ERC4626_0020
531
532
  ],
532
533
  _decode_plain_address,
@@ -164,3 +164,21 @@ ETHEREUM_MORPHO_FLASH_LOAN_FUSE = Web3.to_checksum_address(
164
164
  ETHEREUM_MORPHO_CLAIM_FUSE = Web3.to_checksum_address(
165
165
  "0x6820df665ba09fbbd3240aa303421928ef4c71a1"
166
166
  )
167
+
168
+ # Compound V3 Institutional USDC (market 57), ipor-abi names
169
+ # SupplyFuseCompoundV3InstitutionalUsdc and so on
170
+ ETHEREUM_COMPOUND_V3_INSTITUTIONAL_USDC_SUPPLY_FUSE = Web3.to_checksum_address(
171
+ "0xe7CaDa548534973b9d6A4124bBC476b586d1b3e4"
172
+ )
173
+ ETHEREUM_COMPOUND_V3_INSTITUTIONAL_USDC_BORROW_FUSE = Web3.to_checksum_address(
174
+ "0xff1762A6579787c7eab2E4f55A502F7c36714eF6"
175
+ )
176
+ ETHEREUM_COMPOUND_V3_INSTITUTIONAL_USDC_BALANCE_FUSE = Web3.to_checksum_address(
177
+ "0x5dF0CB1cE5159De1efb8038B5185E4612fAd9168"
178
+ )
179
+ ETHEREUM_COMPOUND_V3_INSTITUTIONAL_USDC_CLAIM_FUSE = Web3.to_checksum_address(
180
+ "0x77271931d24fDEE453C9fb9394F475D3431D80e2"
181
+ )
182
+ ETHEREUM_ERC20_BALANCE_FUSE = Web3.to_checksum_address(
183
+ "0x6cEBf3e3392D0860Ed174402884b941DCBB30654"
184
+ )
@@ -1306,6 +1306,7 @@ class TestUnsupportedBorrowMarkets:
1306
1306
  IporFusionMarkets.MOONWELL,
1307
1307
  IporFusionMarkets.SILO_V2,
1308
1308
  IporFusionMarkets.EBISU,
1309
+ IporFusionMarkets.COMPOUND_V3_INSTITUTIONAL_USDC,
1309
1310
  ],
1310
1311
  )
1311
1312
  def test_borrow_capable_market_is_unreadable_not_absent(self, market_id):
@@ -11,7 +11,11 @@ from ipor_fusion.core.fuse_action import FuseAction
11
11
  from ipor_fusion.fuses.aave_v3 import AaveV3BorrowFuse, AaveV3SupplyFuse
12
12
  from ipor_fusion.fuses.async_action import AsyncActionFuse, AsyncActionSubstrates
13
13
  from ipor_fusion.fuses.base import Fuse
14
- from ipor_fusion.fuses.compound_v3 import CompoundV3SupplyFuse
14
+ from ipor_fusion.fuses.compound_v3 import (
15
+ CompoundV3BorrowFuse,
16
+ CompoundV3ClaimFuse,
17
+ CompoundV3SupplyFuse,
18
+ )
15
19
  from ipor_fusion.fuses.erc4626 import ERC4626SupplyFuse
16
20
  from ipor_fusion.fuses.euler_v2 import (
17
21
  EulerSwapDynamicParams,
@@ -406,6 +410,38 @@ class TestCompoundV3SupplyFuse:
406
410
  assert action.data[:4] == _selector("exit((address,uint256))")
407
411
 
408
412
 
413
+ class TestCompoundV3BorrowFuse:
414
+ def test_borrow(self):
415
+ action = CompoundV3BorrowFuse(FUSE_ADDR).borrow(amount=4000)
416
+ assert action.data[:4] == _selector("enter((uint256))")
417
+ assert decode(["uint256"], action.data[4:]) == (4000,)
418
+
419
+ def test_repay(self):
420
+ action = CompoundV3BorrowFuse(FUSE_ADDR).repay(amount=MAX_UINT256)
421
+ assert action.data[:4] == _selector("exit((uint256))")
422
+ assert decode(["uint256"], action.data[4:]) == (MAX_UINT256,)
423
+
424
+ @pytest.mark.parametrize("bad_amount", [0, -1])
425
+ def test_rejects_bad_amount(self, bad_amount):
426
+ fuse = CompoundV3BorrowFuse(FUSE_ADDR)
427
+ with pytest.raises(ValueError, match="amount"):
428
+ fuse.borrow(amount=bad_amount)
429
+ with pytest.raises(ValueError, match="amount"):
430
+ fuse.repay(amount=bad_amount)
431
+
432
+
433
+ class TestCompoundV3ClaimFuse:
434
+ def test_claim(self):
435
+ action = CompoundV3ClaimFuse(FUSE_ADDR).claim(comet=TOKEN_A)
436
+ assert action.data[:4] == _selector("claim(address)")
437
+ (comet,) = decode(["address"], action.data[4:])
438
+ assert comet.lower() == TOKEN_A_LOW
439
+
440
+ def test_rejects_zero_comet(self):
441
+ with pytest.raises(ValueError, match="comet"):
442
+ CompoundV3ClaimFuse(FUSE_ADDR).claim(comet=ZERO_ADDR)
443
+
444
+
409
445
  # ── ERC4626 ─────────────────────────────────────────────────────────────
410
446
 
411
447
 
@@ -90,6 +90,8 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
90
90
  "Check",
91
91
  "CloneArgs",
92
92
  "CompoundV3Reader",
93
+ "CompoundV3BorrowFuse",
94
+ "CompoundV3ClaimFuse",
93
95
  "CompoundV3SupplyFuse",
94
96
  "ContextManager",
95
97
  "ContractCache",
@@ -859,6 +861,8 @@ _ALL_SNAPSHOT: dict[str, frozenset[str]] = {
859
861
  "AaveV3SupplyFuse",
860
862
  "AsyncActionFuse",
861
863
  "AsyncActionSubstrates",
864
+ "CompoundV3BorrowFuse",
865
+ "CompoundV3ClaimFuse",
862
866
  "CompoundV3SupplyFuse",
863
867
  "ERC4626SupplyFuse",
864
868
  "EXTERNAL_STATE_EVENTS",
@@ -624,6 +624,14 @@ class TestCompoundV3Reader:
624
624
 
625
625
  assert result == Amount(7_500)
626
626
 
627
+ def test_collateral_balance_of(self):
628
+ reader, ctx = _make_reader(CompoundV3Reader)
629
+ ctx.call.return_value = encode(["uint128"], [9_000])
630
+
631
+ result = reader.collateral_balance_of(USER_ADDR, USER_ADDR).call(ctx)
632
+
633
+ assert result == Amount(9_000)
634
+
627
635
 
628
636
  # ── Uniswap V3 ────────────────────────────────────────────────────────
629
637