ipor_fusion is the official Python SDK for IPOR Fusion Plasma Vaults — typed abstractions for DeFi protocol interactions on EVM chains through a fuse adapter pattern.
Maintained by IPOR Labs AG.
| Workflow |
|
| Social |
|
| Code |
|
pip install ipor-fusionfrom ipor_fusion import Web3Context, PlasmaVault, AaveV3SupplyFuse
from web3 import Web3
# 1. Create a Web3 context with your provider and private key
ctx = Web3Context.from_url(
url="https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY",
private_key="0x...",
)
# 2. Wrap the PlasmaVault contract
vault = PlasmaVault(ctx, Web3.to_checksum_address("0xVAULT_ADDRESS"))
# 3. Build a fuse action (e.g. supply USDC to Aave V3)
fuse = AaveV3SupplyFuse(Web3.to_checksum_address("0xFUSE_ADDRESS"))
action = fuse.supply(
asset=Web3.to_checksum_address("0xUSDC_ADDRESS"),
amount=1_000_000, # 1 USDC (6 decimals)
)
# 4. Execute on-chain
receipt = vault.execute([action])The SDK ships with a fusion CLI for inspecting and managing Plasma Vaults from the terminal.
You need an RPC provider URL — get a free key at Alchemy or Infura.
# Install with CLI extras (pipx keeps dependencies isolated)
pipx install 'ipor-fusion[cli]'
# Configure an RPC provider (auto-detects chain ID)
fusion config set-provider https://arb-mainnet.g.alchemy.com/v2/YOUR_KEY
# Inspect a vault (auto-saves to config on first use)
fusion vault info 0xB8a451107A9f87FDe481D4D686247D6e43Ed715e --chain-id ethereum
# List saved vaults
fusion vault listThe SDK includes an MCP server that exposes CLI tools to any MCP-compatible AI assistant (Claude Code, Cursor, Windsurf, etc.).
# Install with MCP extras (pipx keeps dependencies isolated)
pipx install 'ipor-fusion[mcp]'Add to your MCP client configuration (e.g. .mcp.json):
{
"mcpServers": {
"ipor-fusion": {
"command": "fusion-mcp",
"type": "stdio"
}
}
}Available tools:
| Tool | Description |
|---|---|
config_show |
Show current configuration (providers, vaults, API key status) |
config_set_provider |
Set RPC provider URL for a chain (auto-detects chain ID) |
config_set_etherscan_key |
Set Etherscan API key (enables contract name resolution) |
vault_info |
Full on-chain vault state — assets, fuses, balances, lending health, reconciliation |
vault_list |
List all saved vaults |
vault_add |
Save a vault to the local config (auto-fetches on-chain name) |
vault_remove |
Remove a vault from the local config |
Configure providers and vaults via fusion config or the MCP config tools first.
The SDK uses a fuse adapter pattern:
- Fuses encode protocol-specific calls into
FuseActionobjects (pure calldata, no state) - PlasmaVault batches and executes
FuseActionsequences on-chain viaexecute() - Web3Context manages provider connections, signing, and transaction dispatch
Fuse.method() --> FuseAction --> PlasmaVault.execute([actions]) --> on-chain tx
| Module | Purpose |
|---|---|
Web3Context |
Provider connection, signing, tx dispatch |
PlasmaVault |
ERC-4626 vault — execute, deposit, withdraw |
AccessManager |
Role-based access control |
RewardsManager |
Claim and vest rewards |
WithdrawManager |
Time-windowed withdrawal requests |
PriceOracleMiddleware |
Asset price feeds |
| Protocol | Fuses |
|---|---|
| Aave V3 | AaveV3SupplyFuse, AaveV3BorrowFuse |
| Morpho | MorphoSupplyFuse, MorphoCollateralFuse, MorphoBorrowFuse, MorphoFlashLoanFuse, MorphoClaimFuse |
| Uniswap V3 | UniswapV3SwapFuse, UniswapV3NewPositionFuse, UniswapV3ModifyPositionFuse, UniswapV3CollectFuse |
| Ramses V2 | RamsesV2NewPositionFuse, RamsesV2ModifyPositionFuse, RamsesV2CollectFuse, RamsesClaimFuse |
| Compound V3 | CompoundV3SupplyFuse |
| Gearbox V3 | GearboxSupplyFuse, GearboxStakeFuse |
| ERC-4626 | ERC4626SupplyFuse |
| Fluid Instadapp | FluidInstadappSupplyFuse, FluidInstadappStakingFuse |
| Universal | UniversalTokenSwapperFuse |
- Ethereum mainnet
- Arbitrum One
- Base
poetry install # Install dependencies
poetry run pytest tests/test_fuse_encoding.py -n auto -v # Unit tests (fast, no Docker)
poetry run pytest -v -s # All tests (needs Docker + .env)
poetry run black ./ # Format
poetry run pylint --rcfile=pylintrc.toml --verbose --recursive=y . # Lint
poetry run mypy . # Type checkIntegration tests require Docker (Anvil) and provider URLs in .env:
cp .env.example .env
# Edit .env with ARBITRUM_PROVIDER_URL, ETHEREUM_PROVIDER_URL, BASE_PROVIDER_URLFor full usage patterns, see the example repository: ipor-fusion-alpha-example