ipor-fusion 4.0.0.dev28__tar.gz → 4.0.0.dev30__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 (285) hide show
  1. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/PKG-INFO +1 -1
  2. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/pyproject.toml +1 -1
  3. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/__init__.py +20 -0
  4. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/chainlink.py +2 -2
  5. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/codec.py +4 -3
  6. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/contracts.py +25 -14
  7. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/indexer.py +4 -3
  8. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/contracts.py +12 -5
  9. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/lane.py +6 -6
  10. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/messages.py +7 -3
  11. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/contracts.py +26 -13
  12. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/layerzero.py +7 -7
  13. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/transport.py +2 -2
  14. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/transport.py +2 -2
  15. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/stargate.py +4 -3
  16. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/types.py +15 -0
  17. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/typed_client/consumer.py +24 -1
  18. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.claude-plugin/marketplace.json +0 -0
  19. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.claude-plugin/plugin.json +0 -0
  20. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.env.example +0 -0
  21. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.gemini/settings.json +0 -0
  22. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.git-blame-ignore-revs +0 -0
  23. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/cd.yml +0 -0
  24. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/ci.yml +0 -0
  25. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/commit-lint.yml +0 -0
  26. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/notify-slack.yml +0 -0
  27. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/python-build.yml +0 -0
  28. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/python-publish.yml +0 -0
  29. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/release.yml +0 -0
  30. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/report-slack.yml +0 -0
  31. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.gitignore +0 -0
  32. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.mcp.json +0 -0
  33. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.pre-commit-config.yaml +0 -0
  34. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.python-version +0 -0
  35. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/AGENTS.md +0 -0
  36. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CHANGELOG.md +0 -0
  37. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CLAUDE.md +0 -0
  38. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CODEOWNERS +0 -0
  39. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/LICENSE +0 -0
  40. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/README.md +0 -0
  41. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/build.sh +0 -0
  42. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/CONTRIBUTING.md +0 -0
  43. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/README.md +0 -0
  44. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/advanced_euler_v2_credit_market_base.py +0 -0
  45. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
  46. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
  47. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
  48. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/external_state_margin_leg_base.py +0 -0
  49. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/simple_aave_v3_supply_base.py +0 -0
  50. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/pytest.ini +0 -0
  51. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/scripts/commit-check.sh +0 -0
  52. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/scripts/crosschain_readiness.py +0 -0
  53. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/skills/ipor-deploy-vault/SKILL.md +0 -0
  54. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/about.py +0 -0
  55. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cache.py +0 -0
  56. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/chains.py +0 -0
  57. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/__init__.py +0 -0
  58. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
  59. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/config_cmd.py +0 -0
  60. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/config_store.py +0 -0
  61. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/main.py +0 -0
  62. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/market_cmd.py +0 -0
  63. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/options.py +0 -0
  64. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
  65. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_cmd.py +0 -0
  66. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_health.py +0 -0
  67. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_info_view.py +0 -0
  68. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
  69. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_rendering.py +0 -0
  70. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/config/__init__.py +0 -0
  71. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/config/roles.py +0 -0
  72. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/__init__.py +0 -0
  73. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/access.py +0 -0
  74. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/address.py +0 -0
  75. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/context.py +0 -0
  76. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/contract.py +0 -0
  77. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/erc20.py +0 -0
  78. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/external_state_executor.py +0 -0
  79. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fee_manager.py +0 -0
  80. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fuse_action.py +0 -0
  81. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fusion_factory.py +0 -0
  82. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/logs.py +0 -0
  83. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/multicall.py +0 -0
  84. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/oracle.py +0 -0
  85. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/plasma_vault.py +0 -0
  86. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/rewards_manager.py +0 -0
  87. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/simulation.py +0 -0
  88. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/withdraw_manager.py +0 -0
  89. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/__init__.py +0 -0
  90. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
  91. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
  92. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
  93. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
  94. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
  95. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/discovery.py +0 -0
  96. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/errors.py +0 -0
  97. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/logs.py +0 -0
  98. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/simulation.py +0 -0
  99. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
  100. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
  101. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/dependency_graph.py +0 -0
  102. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/entry_cli.py +0 -0
  103. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/entry_mcp.py +0 -0
  104. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/errors.py +0 -0
  105. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/explorer.py +0 -0
  106. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/field_docs.py +0 -0
  107. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/__init__.py +0 -0
  108. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/aave_v3.py +0 -0
  109. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/async_action.py +0 -0
  110. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/base.py +0 -0
  111. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/compound_v3.py +0 -0
  112. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/__init__.py +0 -0
  113. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/base.py +0 -0
  114. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/ccip.py +0 -0
  115. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/erc4626.py +0 -0
  116. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/euler_v2.py +0 -0
  117. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/events.py +0 -0
  118. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/external_state.py +0 -0
  119. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/external_state_events.py +0 -0
  120. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
  121. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
  122. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/hypercore.py +0 -0
  123. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
  124. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/merkl.py +0 -0
  125. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/morpho.py +0 -0
  126. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
  127. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
  128. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/universal.py +0 -0
  129. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/__init__.py +0 -0
  130. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/architecture.md +0 -0
  131. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/glossary.md +0 -0
  132. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/invariants.md +0 -0
  133. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/quickstart.md +0 -0
  134. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/market_ids.py +0 -0
  135. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/market_info.py +0 -0
  136. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/__init__.py +0 -0
  137. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/guide.py +0 -0
  138. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/models.py +0 -0
  139. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/server.py +0 -0
  140. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/morpho_api.py +0 -0
  141. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/py.typed +0 -0
  142. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/__init__.py +0 -0
  143. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/aave_v3.py +0 -0
  144. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/aave_v4.py +0 -0
  145. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/compound_v3.py +0 -0
  146. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/hypercore.py +0 -0
  147. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
  148. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/lending_health.py +0 -0
  149. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/morpho.py +0 -0
  150. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
  151. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/position_manager.py +0 -0
  152. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/ramses_v2.py +0 -0
  153. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
  154. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/unpriceable.py +0 -0
  155. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/substrates.py +0 -0
  156. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/validation.py +0 -0
  157. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/vault_data.py +0 -0
  158. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/vault_info.py +0 -0
  159. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/UniswapV3UniversalRouter.py +0 -0
  160. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain.py +0 -0
  161. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain_lifecycle.py +0 -0
  162. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain_recovery.py +0 -0
  163. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_euler_v2.py +0 -0
  164. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_foundry.py +0 -0
  165. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_guide.py +0 -0
  166. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_hypercore_model.py +0 -0
  167. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_hypercore_shadow.py +0 -0
  168. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_multicall.py +0 -0
  169. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_simulate.py +0 -0
  170. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_validation.py +0 -0
  171. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/addresses.py +0 -0
  172. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/conftest.py +0 -0
  173. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/constants.py +0 -0
  174. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/hypercore_hip3_flow.json +0 -0
  175. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/hypercore_market55.json +0 -0
  176. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/clean.json +0 -0
  177. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/clean.txt +0 -0
  178. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/rich.json +0 -0
  179. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/rich.txt +0 -0
  180. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_about.py +0 -0
  181. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_access_manager.py +0 -0
  182. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cache.py +0 -0
  183. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_chains.py +0 -0
  184. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_changelog.py +0 -0
  185. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_commands.py +0 -0
  186. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_config_store.py +0 -0
  187. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_helpers.py +0 -0
  188. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_hypercore.py +0 -0
  189. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_lending_health.py +0 -0
  190. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_market_morpho_blue.py +0 -0
  191. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_oracle_mapping.py +0 -0
  192. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_pending_requests_scan.py +0 -0
  193. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_role_accounts.py +0 -0
  194. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_info_golden.py +0 -0
  195. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_predates_getters.py +0 -0
  196. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_validate.py +0 -0
  197. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_contract_call.py +0 -0
  198. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_contract_encoder.py +0 -0
  199. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_events.py +0 -0
  200. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_indexer.py +0 -0
  201. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_quote.py +0 -0
  202. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_chainlink.py +0 -0
  203. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_contracts.py +0 -0
  204. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_encoding.py +0 -0
  205. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_errors.py +0 -0
  206. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_lane.py +0 -0
  207. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_layering.py +0 -0
  208. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_readiness.py +0 -0
  209. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_readiness_report.py +0 -0
  210. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_transport.py +0 -0
  211. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_erc20.py +0 -0
  212. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_composed_hypercore.py +0 -0
  213. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_crosschain.py +0 -0
  214. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_euler_looping_arbitrum.py +0 -0
  215. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_vaults.py +0 -0
  216. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_explorer.py +0 -0
  217. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_external_state_events.py +0 -0
  218. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_external_state_executor.py +0 -0
  219. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_fee_manager.py +0 -0
  220. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_fuse_encoding.py +0 -0
  221. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_guide.py +0 -0
  222. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_deployment.py +0 -0
  223. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_events.py +0 -0
  224. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_flow.py +0 -0
  225. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_live.py +0 -0
  226. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_outcome.py +0 -0
  227. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_readers.py +0 -0
  228. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_simulation.py +0 -0
  229. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_logs.py +0 -0
  230. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_hypercore.py +0 -0
  231. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_models.py +0 -0
  232. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_server.py +0 -0
  233. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_vault_validate.py +0 -0
  234. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_multicall.py +0 -0
  235. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_oracle.py +0 -0
  236. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_oracle_mapping.py +0 -0
  237. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_plasma_vault.py +0 -0
  238. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_reader_encoding.py +0 -0
  239. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_readiness_selection.py +0 -0
  240. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_revert_decoding.py +0 -0
  241. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_rewards_manager.py +0 -0
  242. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_roles.py +0 -0
  243. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_sdk_layering.py +0 -0
  244. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
  245. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
  246. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_claim_morpho_rewards.py +0 -0
  247. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_canary.py +0 -0
  248. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_hypercore.py +0 -0
  249. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_hyperevm.py +0 -0
  250. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_lifecycle.py +0 -0
  251. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_batch_base.py +0 -0
  252. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
  253. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
  254. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
  255. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
  256. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_arbitrum.py +0 -0
  257. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_base.py +0 -0
  258. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_crosschain.py +0 -0
  259. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_external_state_executor_base.py +0 -0
  260. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
  261. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_looping_aave_v3_base.py +0 -0
  262. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
  263. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_morpho_blue.py +0 -0
  264. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v3.py +0 -0
  265. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
  266. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v5_ramses.py +0 -0
  267. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
  268. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
  269. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_readers_integration.py +0 -0
  270. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_release_funds.py +0 -0
  271. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_swap_on_base.py +0 -0
  272. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_vault_from_scratch_base.py +0 -0
  273. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_solidity_compiler.py +0 -0
  274. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_solidity_mirrors.py +0 -0
  275. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_substrates.py +0 -0
  276. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_types_and_events.py +0 -0
  277. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_unpriceable_tokens.py +0 -0
  278. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_validation.py +0 -0
  279. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_dep_graph.py +0 -0
  280. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_info_onchain_base.py +0 -0
  281. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
  282. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_simulator_blocks.py +0 -0
  283. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_web3_context.py +0 -0
  284. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_withdraw_manager.py +0 -0
  285. {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ipor-fusion
3
- Version: 4.0.0.dev28
3
+ Version: 4.0.0.dev30
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.dev28"
3
+ version = "4.0.0.dev30"
4
4
  description = "The IPOR Fusion SDK for Python"
5
5
  authors = [
6
6
  { name = "Adam Mydlarz", email = "amydlarz@gmail.com" },
@@ -311,21 +311,31 @@ from ipor_fusion.substrates import (
311
311
  from ipor_fusion.types import (
312
312
  MAX_UINT256,
313
313
  Amount,
314
+ AssetId,
314
315
  AssetSource,
315
316
  ChainId,
317
+ CommandId,
316
318
  Decimals,
319
+ DeploymentRequestId,
317
320
  Fee,
318
321
  Liquidity,
319
322
  MappingStatus,
320
323
  MarketId,
324
+ MessageId,
321
325
  MorphoBlueMarketId,
322
326
  NodeStatus,
327
+ OperationId,
323
328
  Period,
329
+ PositionSetHash,
324
330
  Price,
331
+ ProposalId,
332
+ ReturnRequestId,
325
333
  RoleId,
326
334
  Shares,
335
+ StargateAssetId,
327
336
  Tick,
328
337
  TokenId,
338
+ TransferId,
329
339
  )
330
340
  from ipor_fusion.validation import (
331
341
  Erc20Holding,
@@ -595,6 +605,16 @@ __all__ = [
595
605
  "RoleId",
596
606
  "ChainId",
597
607
  "MorphoBlueMarketId",
608
+ "AssetId",
609
+ "CommandId",
610
+ "DeploymentRequestId",
611
+ "MessageId",
612
+ "OperationId",
613
+ "PositionSetHash",
614
+ "ProposalId",
615
+ "ReturnRequestId",
616
+ "StargateAssetId",
617
+ "TransferId",
598
618
  "Price",
599
619
  "Period",
600
620
  "MAX_UINT256",
@@ -16,7 +16,7 @@ from eth_typing import ChecksumAddress
16
16
  from ipor_fusion.core.context import Web3Context
17
17
  from ipor_fusion.core.contract import Call, ContractWrapper
18
18
  from ipor_fusion.crosschain.contracts import _address
19
- from ipor_fusion.types import ZERO_ADDRESS
19
+ from ipor_fusion.types import ZERO_ADDRESS, MessageId
20
20
 
21
21
 
22
22
  class CcipRouter(ContractWrapper):
@@ -191,7 +191,7 @@ class CcipOffRamp(ContractWrapper):
191
191
  def type_and_version(self) -> Call[str]:
192
192
  return self._view("typeAndVersion()", output_types=["string"])
193
193
 
194
- def execution_state(self, message_id: bytes) -> Call[MessageExecutionState]:
194
+ def execution_state(self, message_id: MessageId) -> Call[MessageExecutionState]:
195
195
  return self._view(
196
196
  "getExecutionState(bytes32)",
197
197
  message_id,
@@ -21,6 +21,7 @@ from web3 import Web3
21
21
 
22
22
  from ipor_fusion.core.contract import _encode_calldata
23
23
  from ipor_fusion.crosschain.logs import log_bytes
24
+ from ipor_fusion.types import MessageId
24
25
 
25
26
  #: topic0 of ``OnRamp 2.0.0``'s ``CCIPMessageSent``; ``destChainSelector``,
26
27
  #: ``sender`` and ``messageId`` are indexed.
@@ -176,7 +177,7 @@ def evm_address(raw: bytes) -> ChecksumAddress:
176
177
  class CcipMessageSent:
177
178
  """One ``CCIPMessageSent`` log: the Router-assigned id plus the decoded message."""
178
179
 
179
- message_id: bytes
180
+ message_id: MessageId
180
181
  dest_chain_selector: int
181
182
  sender: ChecksumAddress
182
183
  message: MessageV1
@@ -193,7 +194,7 @@ class CcipMessageSent:
193
194
  _EVENT_DATA_TYPES, log_bytes(log["data"])
194
195
  )
195
196
  return cls(
196
- message_id=topics[3],
197
+ message_id=MessageId(bytes(topics[3])),
197
198
  dest_chain_selector=int.from_bytes(topics[1], "big"),
198
199
  sender=Web3.to_checksum_address(topics[2][12:]),
199
200
  message=MessageV1.decode(bytes(encoded)),
@@ -215,7 +216,7 @@ class Any2EVMMessage:
215
216
  ``sender`` is the source address; it is ABI-encoded into the wire field,
216
217
  which is how the receivers decode it."""
217
218
 
218
- message_id: bytes
219
+ message_id: MessageId
219
220
  source_chain_selector: int
220
221
  sender: ChecksumAddress
221
222
  data: bytes
@@ -18,7 +18,16 @@ from ipor_fusion.crosschain.contracts import (
18
18
  _address,
19
19
  )
20
20
  from ipor_fusion.crosschain.messages import CommandStatus, CrosschainTransportKind
21
- from ipor_fusion.types import Amount, ChainId
21
+ from ipor_fusion.types import (
22
+ Amount,
23
+ AssetId,
24
+ ChainId,
25
+ CommandId,
26
+ MessageId,
27
+ OperationId,
28
+ PositionSetHash,
29
+ ProposalId,
30
+ )
22
31
 
23
32
 
24
33
  @dataclass(frozen=True, slots=True)
@@ -30,7 +39,7 @@ class CcipObservation:
30
39
  queued_token_amount: Amount
31
40
  state_version: int
32
41
  command_config_epoch: int
33
- tracked_position_set_hash: bytes
42
+ tracked_position_set_hash: PositionSetHash
34
43
 
35
44
 
36
45
  @dataclass(frozen=True, slots=True)
@@ -161,13 +170,13 @@ class CcipCrosschainExecutor(CrosschainExecutor):
161
170
  "activeReturn(uint256)", chain_id, output_types=["bytes32"], decoder=bytes
162
171
  )
163
172
 
164
- def active_command(self, chain_id: ChainId) -> Call[bytes]:
173
+ def active_command(self, chain_id: ChainId) -> Call[CommandId]:
165
174
  """The active command id for the chain, or 32 zero bytes."""
166
175
  return self._view(
167
176
  "activeCommand(uint256)",
168
177
  chain_id,
169
178
  output_types=["bytes32"],
170
- decoder=bytes,
179
+ decoder=lambda value: CommandId(bytes(value)),
171
180
  )
172
181
 
173
182
  def next_command_sequence(self, chain_id: ChainId) -> Call[int]:
@@ -203,7 +212,7 @@ class CcipCrosschainExecutor(CrosschainExecutor):
203
212
  decoder=Amount,
204
213
  )
205
214
 
206
- def command_status(self, command_id: bytes) -> Call[CommandStatus]:
215
+ def command_status(self, command_id: CommandId) -> Call[CommandStatus]:
207
216
  return self._view(
208
217
  "commandStatus(bytes32)",
209
218
  command_id,
@@ -219,7 +228,7 @@ class CcipCrosschainExecutor(CrosschainExecutor):
219
228
  "pendingTransferCount(uint256)", chain_id, output_types=["uint8"]
220
229
  )
221
230
 
222
- def processed_ccip_message(self, message_id: bytes) -> Call[bool]:
231
+ def processed_ccip_message(self, message_id: MessageId) -> Call[bool]:
223
232
  return self._view(
224
233
  "processedCcipMessage(bytes32)", message_id, output_types=["bool"]
225
234
  )
@@ -236,7 +245,7 @@ class CcipCrosschainExecutor(CrosschainExecutor):
236
245
  output_types=["uint256"],
237
246
  )
238
247
 
239
- def reject_balance_and_block(self, proposal_id: int) -> Call[None]:
248
+ def reject_balance_and_block(self, proposal_id: ProposalId) -> Call[None]:
240
249
  """``BALANCE_APPROVER`` only: reject and fail the chain closed."""
241
250
  return self._write("rejectBalanceAndBlock(uint256)", proposal_id)
242
251
 
@@ -292,12 +301,12 @@ class CcipCrosschainDispatcher(CrosschainDispatcher):
292
301
  "queuedTokenAmount()", output_types=["uint256"], decoder=Amount
293
302
  )
294
303
 
295
- def processed_operation(self, operation_id: bytes) -> Call[bool]:
304
+ def processed_operation(self, operation_id: OperationId) -> Call[bool]:
296
305
  return self._view(
297
306
  "processedOperation(bytes32)", operation_id, output_types=["bool"]
298
307
  )
299
308
 
300
- def processed_ccip_message(self, message_id: bytes) -> Call[bool]:
309
+ def processed_ccip_message(self, message_id: MessageId) -> Call[bool]:
301
310
  return self._view(
302
311
  "processedCcipMessage(bytes32)", message_id, output_types=["bool"]
303
312
  )
@@ -316,7 +325,7 @@ def _ccip_observation_decoder(values: tuple) -> CcipObservation:
316
325
  queued_token_amount=Amount(queued),
317
326
  state_version=int(version),
318
327
  command_config_epoch=int(epoch),
319
- tracked_position_set_hash=bytes(set_hash),
328
+ tracked_position_set_hash=PositionSetHash(bytes(set_hash)),
320
329
  )
321
330
 
322
331
 
@@ -327,7 +336,7 @@ class CcipCrosschainFactory(CrosschainFactory):
327
336
  def create_executor(
328
337
  self,
329
338
  user_salt: bytes,
330
- asset_id: bytes,
339
+ asset_id: AssetId,
331
340
  manager: ChecksumAddress,
332
341
  safety: SafetyConfig,
333
342
  ) -> Call[ChecksumAddress]:
@@ -365,7 +374,9 @@ class CcipCrosschainFactory(CrosschainFactory):
365
374
  decoder=ChainId,
366
375
  )
367
376
 
368
- def asset_config(self, asset_id: bytes) -> Call[tuple[ChecksumAddress, int, bool]]:
377
+ def asset_config(
378
+ self, asset_id: AssetId
379
+ ) -> Call[tuple[ChecksumAddress, int, bool]]:
369
380
  """``(token, sharedDecimals, enabled)`` for an asset id."""
370
381
  return self._view(
371
382
  "assetConfig(bytes32)",
@@ -444,7 +455,7 @@ class CcipCrosschainFactory(CrosschainFactory):
444
455
  )
445
456
 
446
457
  def schedule_asset(
447
- self, asset_id: bytes, token: ChecksumAddress, shared_decimals: int
458
+ self, asset_id: AssetId, token: ChecksumAddress, shared_decimals: int
448
459
  ) -> Call[None]:
449
460
  """Owner-only; executable after ``config_delay`` with the same arguments."""
450
461
  return self._write(
@@ -452,7 +463,7 @@ class CcipCrosschainFactory(CrosschainFactory):
452
463
  )
453
464
 
454
465
  def execute_asset(
455
- self, asset_id: bytes, token: ChecksumAddress, shared_decimals: int
466
+ self, asset_id: AssetId, token: ChecksumAddress, shared_decimals: int
456
467
  ) -> Call[None]:
457
468
  return self._write(
458
469
  "executeAsset(bytes32,address,uint8)", asset_id, token, shared_decimals
@@ -21,6 +21,7 @@ from web3 import Web3
21
21
 
22
22
  from ipor_fusion.core.contract import Call
23
23
  from ipor_fusion.crosschain.ccip.chainlink import CcipOffRamp
24
+ from ipor_fusion.types import MessageId
24
25
 
25
26
  #: Chainlink Labs' public mainnet indexers, tried in order.
26
27
  INDEXER_URLS: tuple[str, ...] = (
@@ -40,7 +41,7 @@ class VerifierResultUnavailable(LookupError):
40
41
  class VerifierResult:
41
42
  """One message's committee result as the indexer serves it."""
42
43
 
43
- message_id: bytes
44
+ message_id: MessageId
44
45
  #: The CCVs the message names, in the order ``execute`` expects.
45
46
  ccv_addresses: tuple[ChecksumAddress, ...]
46
47
  #: The verifier result for the committee CCV: version tag, signature
@@ -54,7 +55,7 @@ class VerifierResult:
54
55
 
55
56
 
56
57
  def fetch_verifier_result(
57
- message_id: bytes,
58
+ message_id: MessageId,
58
59
  *,
59
60
  indexers: Sequence[str] = INDEXER_URLS,
60
61
  timeout: float = 15.0,
@@ -82,7 +83,7 @@ def fetch_verifier_result(
82
83
  continue
83
84
  result = results[0]["verifierResult"]
84
85
  return VerifierResult(
85
- message_id=bytes.fromhex(result["message_id"][2:]),
86
+ message_id=MessageId(bytes.fromhex(result["message_id"][2:])),
86
87
  ccv_addresses=tuple(
87
88
  Web3.to_checksum_address(a) for a in result["message_ccv_addresses"]
88
89
  ),
@@ -19,7 +19,14 @@ from web3 import Web3
19
19
 
20
20
  from ipor_fusion.core.contract import Call, ContractWrapper
21
21
  from ipor_fusion.crosschain.messages import CommandStatus
22
- from ipor_fusion.types import Amount, ChainId
22
+ from ipor_fusion.types import (
23
+ Amount,
24
+ AssetId,
25
+ ChainId,
26
+ CommandId,
27
+ PositionSetHash,
28
+ ProposalId,
29
+ )
23
30
 
24
31
 
25
32
  @dataclass(frozen=True, slots=True)
@@ -36,7 +43,7 @@ class BalanceObservation:
36
43
  remote_block: int
37
44
  remote_timestamp: int
38
45
  expiry: int
39
- tracked_position_set_hash: bytes
46
+ tracked_position_set_hash: PositionSetHash
40
47
 
41
48
  def as_tuple(self) -> tuple:
42
49
  return (
@@ -150,7 +157,7 @@ class CrosschainExecutor(ContractWrapper):
150
157
  "lastApprovedObservedAt(uint256)", chain_id, output_types=["uint64"]
151
158
  )
152
159
 
153
- def approve_balance(self, proposal_id: int) -> Call[None]:
160
+ def approve_balance(self, proposal_id: ProposalId) -> Call[None]:
154
161
  """``BALANCE_APPROVER`` only."""
155
162
  return self._write("approveBalance(uint256)", proposal_id)
156
163
 
@@ -205,7 +212,7 @@ class CrosschainDispatcher(ContractWrapper):
205
212
  "pendingRequestShares(address)", vault, output_types=["uint256"]
206
213
  )
207
214
 
208
- def command_status(self, command_id: bytes) -> Call[CommandStatus]:
215
+ def command_status(self, command_id: CommandId) -> Call[CommandStatus]:
209
216
  return self._view(
210
217
  "commandStatus(bytes32)",
211
218
  command_id,
@@ -253,7 +260,7 @@ class CrosschainFactory(ContractWrapper):
253
260
  def is_allowed_creator(self, creator: ChecksumAddress) -> Call[bool]:
254
261
  return self._view("isAllowedCreator(address)", creator, output_types=["bool"])
255
262
 
256
- def asset_frozen(self, asset_id: bytes) -> Call[bool]:
263
+ def asset_frozen(self, asset_id: AssetId) -> Call[bool]:
257
264
  return self._view("assetFrozen(bytes32)", asset_id, output_types=["bool"])
258
265
 
259
266
  def creation_codes_configured(self) -> Call[bool]:
@@ -40,7 +40,7 @@ from ipor_fusion.fuses.crosschain.base import (
40
40
  CrosschainSupplyFuse,
41
41
  SendParams,
42
42
  )
43
- from ipor_fusion.types import Amount, ChainId
43
+ from ipor_fusion.types import Amount, ChainId, PositionSetHash, ProposalId
44
44
 
45
45
 
46
46
  @dataclass(frozen=True, slots=True)
@@ -54,7 +54,7 @@ class LaneObservation:
54
54
  accounted_balance: Amount
55
55
  state_version: int
56
56
  command_config_epoch: int
57
- tracked_position_set_hash: bytes
57
+ tracked_position_set_hash: PositionSetHash
58
58
 
59
59
 
60
60
  @dataclass(frozen=True, slots=True)
@@ -241,11 +241,11 @@ class CrosschainLane(ABC):
241
241
  last = self.last_approved_observed_at().call()
242
242
  return last == 0 or now - last > self.staleness_max().call() - margin
243
243
 
244
- def approve_balance(self, proposal_id: int) -> Call[None]:
244
+ def approve_balance(self, proposal_id: ProposalId) -> Call[None]:
245
245
  """``BALANCE_APPROVER`` only."""
246
246
  return self.executor.approve_balance(proposal_id)
247
247
 
248
- def proposal_id_from_logs(self, logs: Iterable[Mapping]) -> int:
248
+ def proposal_id_from_logs(self, logs: Iterable[Mapping]) -> ProposalId:
249
249
  """The id of the proposal this lane's executor emitted in ``logs``
250
250
  (a receipt's or a simulated call's), from its ``BalanceProposed``."""
251
251
  for log in logs:
@@ -254,10 +254,10 @@ class CrosschainLane(ABC):
254
254
  and log_address(log) == self.executor_address
255
255
  ):
256
256
  (proposal_id,) = decode(["uint256"], log_bytes(log["data"])[:32])
257
- return int(proposal_id)
257
+ return ProposalId(int(proposal_id))
258
258
  raise ValueError("no BalanceProposed log from the executor")
259
259
 
260
- def proposal_id_from_receipt(self, receipt: Mapping) -> int:
260
+ def proposal_id_from_receipt(self, receipt: Mapping) -> ProposalId:
261
261
  return self.proposal_id_from_logs(receipt["logs"])
262
262
 
263
263
  def _require_spoke(self, observation: BalanceObservation) -> None:
@@ -18,7 +18,7 @@ from eth_typing import ChecksumAddress
18
18
  from web3 import Web3
19
19
 
20
20
  from ipor_fusion.core.address import _validate_not_zero_address
21
- from ipor_fusion.types import Amount, Shares
21
+ from ipor_fusion.types import Amount, CommandId, Shares
22
22
 
23
23
  #: ``CrosschainConstants.CODEC_VERSION`` -- the Stargate/LayerZero envelope version.
24
24
  CODEC_VERSION = 3
@@ -128,6 +128,10 @@ _ZERO_SHARES = Shares(0)
128
128
  COMMAND_TUPLE_TYPE = "(bytes32,uint64,uint64,uint8,bytes)"
129
129
 
130
130
 
131
+ # The zero command id: no command, or one not yet assigned by the executor.
132
+ NO_COMMAND_ID = CommandId(bytes(32))
133
+
134
+
131
135
  @dataclass(frozen=True, slots=True)
132
136
  class Command:
133
137
  """``CrosschainMessages.Command``: one business command for a dispatcher.
@@ -143,7 +147,7 @@ class Command:
143
147
 
144
148
  action: BusinessAction
145
149
  action_data: bytes
146
- command_id: bytes = bytes(32)
150
+ command_id: CommandId = NO_COMMAND_ID
147
151
  sequence: int = 0
148
152
  command_config_epoch: int = 0
149
153
 
@@ -167,7 +171,7 @@ class Command:
167
171
  return cls(
168
172
  action=BusinessAction(action),
169
173
  action_data=bytes(action_data),
170
- command_id=bytes(command_id),
174
+ command_id=CommandId(bytes(command_id)),
171
175
  sequence=int(sequence),
172
176
  command_config_epoch=int(config_epoch),
173
177
  )
@@ -17,7 +17,18 @@ from ipor_fusion.crosschain.contracts import (
17
17
  _address_list,
18
18
  )
19
19
  from ipor_fusion.crosschain.messages import CommandStatus, DeploymentStatus
20
- from ipor_fusion.types import Amount, ChainId
20
+ from ipor_fusion.types import (
21
+ Amount,
22
+ AssetId,
23
+ ChainId,
24
+ CommandId,
25
+ DeploymentRequestId,
26
+ PositionSetHash,
27
+ ProposalId,
28
+ ReturnRequestId,
29
+ StargateAssetId,
30
+ TransferId,
31
+ )
21
32
 
22
33
 
23
34
  @dataclass(frozen=True, slots=True)
@@ -28,7 +39,7 @@ class ActiveCommand:
28
39
  is_config_update: bool
29
40
  awaiting_cancel: bool
30
41
  status: CommandStatus
31
- command_id: bytes
42
+ command_id: CommandId
32
43
  sequence: int
33
44
  new_config_epoch: int
34
45
 
@@ -43,7 +54,7 @@ class Observation:
43
54
  vault_asset_values: list[Amount]
44
55
  state_version: int
45
56
  command_config_epoch: int
46
- tracked_position_set_hash: bytes
57
+ tracked_position_set_hash: PositionSetHash
47
58
 
48
59
 
49
60
  @dataclass(frozen=True, slots=True)
@@ -51,7 +62,7 @@ class ExecutorInitParams:
51
62
  """``ICrosschainFactory.ExecutorInitParams``: the immutable configuration
52
63
  ``StargateCrosschainFactory.createExecutor`` bakes into an executor."""
53
64
 
54
- asset_id: bytes
65
+ asset_id: AssetId
55
66
  manager: ChecksumAddress
56
67
  admin: ChecksumAddress
57
68
  rescue_guardian: ChecksumAddress
@@ -188,7 +199,9 @@ class StargateCrosschainExecutor(CrosschainExecutor):
188
199
  def last_approval_at(self, chain_id: ChainId) -> Call[int]:
189
200
  return self._view("lastApprovalAt(uint256)", chain_id, output_types=["uint64"])
190
201
 
191
- def deployment_status(self, request_id: int) -> Call[DeploymentStatus]:
202
+ def deployment_status(
203
+ self, request_id: DeploymentRequestId
204
+ ) -> Call[DeploymentStatus]:
192
205
  return self._view(
193
206
  "deploymentStatus(uint256)",
194
207
  request_id,
@@ -202,7 +215,7 @@ class StargateCrosschainExecutor(CrosschainExecutor):
202
215
  f"proposeBalance({_BALANCE_OBSERVATION_TUPLE})", observation.as_tuple()
203
216
  )
204
217
 
205
- def reject_and_block_proposal(self, proposal_id: int) -> Call[None]:
218
+ def reject_and_block_proposal(self, proposal_id: ProposalId) -> Call[None]:
206
219
  """``BALANCE_APPROVER`` only: reject and fail the chain closed."""
207
220
  return self._write("rejectAndBlockProposal(uint256)", proposal_id)
208
221
 
@@ -219,7 +232,7 @@ def _active_command_decoder(values: tuple) -> ActiveCommand:
219
232
  is_config_update=bool(is_config),
220
233
  awaiting_cancel=bool(awaiting_cancel),
221
234
  status=CommandStatus(status),
222
- command_id=bytes(command_id),
235
+ command_id=CommandId(bytes(command_id)),
223
236
  sequence=int(sequence),
224
237
  new_config_epoch=int(epoch),
225
238
  )
@@ -254,10 +267,10 @@ class StargateCrosschainDispatcher(CrosschainDispatcher):
254
267
  "getTrackedVaults()", output_types=["address[]"], decoder=_address_list
255
268
  )
256
269
 
257
- def recall_consumed(self, request_id: bytes) -> Call[bool]:
270
+ def recall_consumed(self, request_id: ReturnRequestId) -> Call[bool]:
258
271
  return self._view("recallConsumed(bytes32)", request_id, output_types=["bool"])
259
272
 
260
- def transfer_settled(self, transfer_id: bytes) -> Call[bool]:
273
+ def transfer_settled(self, transfer_id: TransferId) -> Call[bool]:
261
274
  return self._view(
262
275
  "transferSettled(bytes32)", transfer_id, output_types=["bool"]
263
276
  )
@@ -271,7 +284,7 @@ def _observation_decoder(values: tuple) -> Observation:
271
284
  vault_asset_values=[Amount(v) for v in asset_values],
272
285
  state_version=int(version),
273
286
  command_config_epoch=int(epoch),
274
- tracked_position_set_hash=bytes(set_hash),
287
+ tracked_position_set_hash=PositionSetHash(bytes(set_hash)),
275
288
  )
276
289
 
277
290
 
@@ -283,7 +296,7 @@ class StargateTokenMessaging(ContractWrapper):
283
296
  """The peer OApp on ``eid`` as bytes32; zero when no route exists."""
284
297
  return self._view("peers(uint32)", eid, output_types=["bytes32"])
285
298
 
286
- def stargate_impls(self, asset_id: int) -> Call[ChecksumAddress]:
299
+ def stargate_impls(self, asset_id: StargateAssetId) -> Call[ChecksumAddress]:
287
300
  """The local pool of ``asset_id``."""
288
301
  return self._view(
289
302
  "stargateImpls(uint16)",
@@ -321,7 +334,7 @@ class StargateCrosschainFactory(CrosschainFactory):
321
334
  )
322
335
 
323
336
  def asset_config(
324
- self, asset_id: bytes
337
+ self, asset_id: AssetId
325
338
  ) -> Call[tuple[ChecksumAddress, ChecksumAddress, bool]]:
326
339
  """``(localToken, localStargatePool, enabled)`` for an asset id."""
327
340
  return self._view(
@@ -343,6 +356,6 @@ class StargateCrosschainFactory(CrosschainFactory):
343
356
  def request_count(self) -> Call[int]:
344
357
  return self._view("requestCount()", output_types=["uint256"])
345
358
 
346
- def cancel_pending_deployment(self, request_id: int) -> Call[None]:
359
+ def cancel_pending_deployment(self, request_id: DeploymentRequestId) -> Call[None]:
347
360
  """Permissionless after the executor's ``DEPLOYMENT_TTL``."""
348
361
  return self._write("cancelPendingDeployment(uint256)", request_id)
@@ -30,7 +30,7 @@ from web3 import Web3
30
30
  from ipor_fusion.core.address import _validate_not_zero_address
31
31
  from ipor_fusion.core.contract import _encode_calldata
32
32
  from ipor_fusion.crosschain.logs import log_bytes
33
- from ipor_fusion.types import ZERO_ADDRESS
33
+ from ipor_fusion.types import ZERO_ADDRESS, MessageId, StargateAssetId
34
34
 
35
35
  _TYPE_3 = b"\x00\x03"
36
36
  _EXECUTOR_WORKER_ID = 1
@@ -153,7 +153,7 @@ class Packet:
153
153
  sender: ChecksumAddress
154
154
  dst_eid: int
155
155
  receiver: ChecksumAddress
156
- guid: bytes
156
+ guid: MessageId
157
157
  message: bytes
158
158
 
159
159
  @classmethod
@@ -166,7 +166,7 @@ class Packet:
166
166
  sender=bytes32_to_address(encoded[13:45]),
167
167
  dst_eid=int.from_bytes(encoded[45:49], "big"),
168
168
  receiver=bytes32_to_address(encoded[49:81]),
169
- guid=encoded[81:113],
169
+ guid=MessageId(encoded[81:113]),
170
170
  message=encoded[113:],
171
171
  )
172
172
 
@@ -185,7 +185,7 @@ class TaxiMessage:
185
185
  ``TokenMessaging`` packet. ``compose_msg`` is the raw compose payload
186
186
  ``composeFrom (bytes32) || message`` or empty."""
187
187
 
188
- asset_id: int
188
+ asset_id: StargateAssetId
189
189
  receiver: ChecksumAddress
190
190
  amount_sd: int
191
191
  compose_msg: bytes
@@ -195,7 +195,7 @@ class TaxiMessage:
195
195
  if len(message) < 43 or message[0] != _MSG_TYPE_TAXI:
196
196
  raise ValueError("not a Stargate taxi message")
197
197
  return cls(
198
- asset_id=int.from_bytes(message[1:3], "big"),
198
+ asset_id=StargateAssetId(int.from_bytes(message[1:3], "big")),
199
199
  receiver=bytes32_to_address(message[3:35]),
200
200
  amount_sd=int.from_bytes(message[35:43], "big"),
201
201
  compose_msg=message[43:],
@@ -231,7 +231,7 @@ def lz_receive_calldata(
231
231
  src_eid: int,
232
232
  sender: ChecksumAddress,
233
233
  nonce: int,
234
- guid: bytes,
234
+ guid: MessageId,
235
235
  message: bytes,
236
236
  executor: ChecksumAddress = ZERO_ADDRESS, # type: ignore[assignment]
237
237
  extra_data: bytes = b"",
@@ -250,7 +250,7 @@ def lz_receive_calldata(
250
250
  def lz_compose_calldata(
251
251
  *,
252
252
  from_: ChecksumAddress,
253
- guid: bytes,
253
+ guid: MessageId,
254
254
  message: bytes,
255
255
  executor: ChecksumAddress = ZERO_ADDRESS, # type: ignore[assignment]
256
256
  extra_data: bytes = b"",
@@ -29,7 +29,7 @@ from ipor_fusion.crosschain.transport import (
29
29
  OutboundMessage,
30
30
  transfer_call,
31
31
  )
32
- from ipor_fusion.types import ChainId
32
+ from ipor_fusion.types import ChainId, StargateAssetId
33
33
 
34
34
 
35
35
  @dataclass(frozen=True, slots=True)
@@ -50,7 +50,7 @@ class StargateChain:
50
50
  token_messaging: ChecksumAddress
51
51
  stargate_pool: ChecksumAddress
52
52
  token: ChecksumAddress
53
- asset_id: int
53
+ asset_id: StargateAssetId
54
54
  local_decimals: int
55
55
  shared_decimals: int
56
56
  token_source: ChecksumAddress | None = None
@@ -30,7 +30,7 @@ from ipor_fusion.core.context import Web3Context
30
30
  from ipor_fusion.core.contract import _encode_calldata
31
31
  from ipor_fusion.crosschain.contracts import CrosschainDispatcher, CrosschainExecutor
32
32
  from ipor_fusion.crosschain.messages import CrosschainTransportKind
33
- from ipor_fusion.types import ChainId
33
+ from ipor_fusion.types import ChainId, MessageId
34
34
 
35
35
 
36
36
  @dataclass(frozen=True, slots=True)
@@ -44,7 +44,7 @@ class OutboundMessage:
44
44
  """
45
45
 
46
46
  transport_kind: CrosschainTransportKind
47
- message_id: bytes
47
+ message_id: MessageId
48
48
  src_chain_id: ChainId
49
49
  dst_chain_id: ChainId
50
50
  sender: ChecksumAddress
@@ -33,9 +33,10 @@ from ipor_fusion.fuses.crosschain.base import (
33
33
  CrosschainSupplyFuse,
34
34
  SendParams,
35
35
  )
36
- from ipor_fusion.types import Amount, ChainId
36
+ from ipor_fusion.types import Amount, ChainId, DeploymentRequestId
37
37
 
38
38
  _NO_CHAIN = ChainId(0)
39
+ _NO_REQUEST = DeploymentRequestId(0)
39
40
  _ZERO_AMOUNT = Amount(0)
40
41
 
41
42
 
@@ -174,7 +175,7 @@ class StargateCrosschainCommandFuse(CrosschainCommandFuse):
174
175
  eid: int = 0,
175
176
  enforced_options: bytes = b"",
176
177
  plasma_vaults: Sequence[ChecksumAddress] = (),
177
- request_id: int = 0,
178
+ request_id: DeploymentRequestId = _NO_REQUEST,
178
179
  command: Command = EMPTY_COMMAND,
179
180
  ) -> FuseAction:
180
181
  """Forward one operation to the executor. Only the fields the operation
@@ -264,7 +265,7 @@ class StargateCrosschainCommandFuse(CrosschainCommandFuse):
264
265
  command_type: StargateCrosschainCommandType,
265
266
  chain_id: ChainId,
266
267
  eid: int,
267
- request_id: int,
268
+ request_id: DeploymentRequestId,
268
269
  command: Command,
269
270
  ) -> None:
270
271
  if command_type == StargateCrosschainCommandType.UNDEFINED: