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.
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/PKG-INFO +1 -1
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/pyproject.toml +1 -1
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/__init__.py +20 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/chainlink.py +2 -2
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/codec.py +4 -3
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/contracts.py +25 -14
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/indexer.py +4 -3
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/contracts.py +12 -5
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/lane.py +6 -6
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/messages.py +7 -3
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/contracts.py +26 -13
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/layerzero.py +7 -7
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/transport.py +2 -2
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/transport.py +2 -2
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/stargate.py +4 -3
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/types.py +15 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/typed_client/consumer.py +24 -1
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.claude-plugin/marketplace.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.claude-plugin/plugin.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.env.example +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.gemini/settings.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.git-blame-ignore-revs +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/cd.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/ci.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/commit-lint.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/notify-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/python-build.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/python-publish.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/release.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.github/workflows/report-slack.yml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.gitignore +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.mcp.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.pre-commit-config.yaml +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/.python-version +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/AGENTS.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CHANGELOG.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CLAUDE.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/CODEOWNERS +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/LICENSE +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/README.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/build.sh +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/CONTRIBUTING.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/README.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/advanced_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/advanced_euler_v2_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/composed_hypercore_flow_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/crosschain_ccip_usdc_arbitrum_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/external_state_margin_leg_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/examples/simple_aave_v3_supply_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/pytest.ini +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/scripts/commit-check.sh +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/scripts/crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/skills/ipor-deploy-vault/SKILL.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/about.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cache.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/chains.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/changelog_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/config_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/config_store.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/main.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/market_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/options.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/oracle_mapping_view.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_cmd.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_health.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_info_view.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_markets_view.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/cli/vault_rendering.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/config/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/config/roles.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/access.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/address.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/context.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/contract.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/erc20.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fuse_action.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/fusion_factory.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/logs.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/multicall.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/oracle.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/core/withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/lane.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/quote.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/transport.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/discovery.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/errors.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/logs.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/simulation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/lane.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/dependency_graph.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/entry_cli.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/entry_mcp.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/errors.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/explorer.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/field_docs.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/async_action.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/ccip.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/erc4626.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/external_state.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/fluid_instadapp.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/gearbox_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/merkl.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/universal.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/architecture.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/glossary.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/invariants.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/guide/quickstart.md +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/market_ids.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/market_info.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/guide.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/models.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/mcp/server.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/morpho_api.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/py.typed +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/__init__.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/aave_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/aave_v4.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/compound_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/morpho.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/position_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/ramses_v2.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/uniswap_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/readers/unpriceable.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/substrates.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/validation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/vault_data.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/vault_info.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/UniswapV3UniversalRouter.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_crosschain_recovery.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_euler_v2.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_foundry.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_guide.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_hypercore_model.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_hypercore_shadow.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_simulate.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/_validation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/addresses.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/conftest.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/constants.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/hypercore_hip3_flow.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/hypercore_market55.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/clean.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/clean.txt +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/rich.json +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/fixtures/vault_info_golden/rich.txt +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_about.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_access_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cache.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_chains.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_changelog.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_commands.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_config_store.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_helpers.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_lending_health.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_market_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_pending_requests_scan.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_role_accounts.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_info_golden.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_predates_getters.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_cli_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_contract_call.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_contract_encoder.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_indexer.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_ccip_quote.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_chainlink.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_contracts.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_errors.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_lane.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_layering.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_readiness.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_readiness_report.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_crosschain_transport.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_erc20.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_composed_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_euler_looping_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_examples_vaults.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_explorer.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_external_state_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_external_state_executor.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_fee_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_fuse_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_guide.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_deployment.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_flow.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_live.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_outcome.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_readers.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_hypercore_simulation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_logs.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_models.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_server.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_mcp_vault_validate.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_multicall.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_oracle.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_oracle_mapping.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_plasma_vault.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_reader_encoding.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_readiness_selection.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_revert_decoding.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_rewards_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_roles.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_sdk_layering.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_borrow_aave_v3_mainnet.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_claim_merkl_wrapper_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_claim_morpho_rewards.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_canary.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_hypercore.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_hyperevm.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_crosschain_lifecycle.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_batch_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_credit_market_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_deploy_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_reconfigure_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_euler_v2_swap_registry_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_arbitrum.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_examples_crosschain.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_external_state_executor_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_fusion_factory_clone_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_looping_aave_v3_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_looping_morpho_blue_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_morpho_blue.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v3.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v4_uniswap.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v5_ramses.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_pilot_v5_scheduled.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_plasma_vault_setters_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_readers_integration.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_release_funds.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_swap_on_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_simulate_vault_from_scratch_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_solidity_compiler.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_solidity_mirrors.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_substrates.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_types_and_events.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_unpriceable_tokens.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_validation.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_dep_graph.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_info_onchain_base.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_info_onchain_base_no_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_vault_simulator_blocks.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_web3_context.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/tests/test_withdraw_manager.py +0 -0
- {ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/uv.lock +0 -0
|
@@ -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",
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/chainlink.py
RENAMED
|
@@ -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:
|
|
194
|
+
def execution_state(self, message_id: MessageId) -> Call[MessageExecutionState]:
|
|
195
195
|
return self._view(
|
|
196
196
|
"getExecutionState(bytes32)",
|
|
197
197
|
message_id,
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/codec.py
RENAMED
|
@@ -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:
|
|
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:
|
|
219
|
+
message_id: MessageId
|
|
219
220
|
source_chain_selector: int
|
|
220
221
|
sender: ChecksumAddress
|
|
221
222
|
data: bytes
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/contracts.py
RENAMED
|
@@ -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
|
|
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:
|
|
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[
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/ccip/indexer.py
RENAMED
|
@@ -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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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]) ->
|
|
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) ->
|
|
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:
|
|
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
|
)
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/contracts.py
RENAMED
|
@@ -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
|
|
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:
|
|
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:
|
|
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:
|
|
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(
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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)
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/layerzero.py
RENAMED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
253
|
+
guid: MessageId,
|
|
254
254
|
message: bytes,
|
|
255
255
|
executor: ChecksumAddress = ZERO_ADDRESS, # type: ignore[assignment]
|
|
256
256
|
extra_data: bytes = b"",
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/crosschain/stargate/transport.py
RENAMED
|
@@ -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:
|
|
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:
|
|
47
|
+
message_id: MessageId
|
|
48
48
|
src_chain_id: ChainId
|
|
49
49
|
dst_chain_id: ChainId
|
|
50
50
|
sender: ChecksumAddress
|
{ipor_fusion-4.0.0.dev28 → ipor_fusion-4.0.0.dev30}/src/ipor_fusion/fuses/crosschain/stargate.py
RENAMED
|
@@ -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:
|
|
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:
|
|
268
|
+
request_id: DeploymentRequestId,
|
|
268
269
|
command: Command,
|
|
269
270
|
) -> None:
|
|
270
271
|
if command_type == StargateCrosschainCommandType.UNDEFINED:
|