v3.8.0
v3.8.0 adds cross-chain Fusion vaults over Chainlink CCIP and Stargate, and reads of HyperCore transfer outcomes, both as preview features. It applies to code built on cross-chain or HyperCore vaults and to code that simulates vault actions with VaultSimulator.
New
1. Cross-chain vaults (preview)
Now: the SDK moves funds and commands between Fusion vaults on different chains over Chainlink CCIP and Stargate. It finds a deployment, attests remote balances, quotes the bridge fee, executes a verified message by hand, simulates deployments and decodes the cross-chain events and errors.
Usage: the example examples/crosschain_ccip_usdc_arbitrum_hyperevm.py calls each step of the Arbitrum to HyperEVM lifecycle in simulation.
2. Cross-chain readiness checks (preview)
Now: the readiness check for the Arbitrum and HyperEVM route flags messages into HyperEVM that will need manual execution. It derives the verdict from whether Chainlink’s executors on HyperEVM send on big blocks.
Usage: uv run python scripts/crosschain_readiness.py --output readiness-report.json writes the report from the repository. A flagged message is executed by hand with CcipOffRamp.execute.
3. HyperCore transfer outcomes (preview)
Now: read_hypercore_transfer_outcome reads the result of a transfer between a vault and HyperCore as a HyperCoreTransferStatus: pending, applied, dropped, indeterminate or superseded.
Usage: read_hypercore_transfer_outcome(ctx, before, direction) takes a snapshot from before the transfer and compares it with a new one. The status is inferred from balances. It holds when no other vault action or balance movement happens between the two snapshots.
4. Simulation options
Now: a simulated call reports its decoded revert reason in SimulatedCallResult.revert_reason and accepts a gas cap through add_call(..., gas=...). VaultSimulator.with_erc20_balance funds any holder by setting its token balance in storage.
Usage: add_call(..., gas=n) caps the gas of one call, for example one that stores contract-sized data. with_erc20_balance(token, holder, amount, slot=...) sets a holder’s balance in the current simulated block.
5. Unpriceable token check
Now: fusion vault info reports a critical finding for each granted substrate whose token the price oracle middleware cannot price. A reverting price read makes the balance fuse revert, which blocks updateMarketsBalances and every execute that touches the market.
Impact: fusion vault info reports an unpriceable token as critical before a position triggers the revert.
6. Botanix and Ink chain names
Before: the CLI rejected --chain-id botanix and --chain-id ink and printed bare chain ids.
Now: CHAIN_NAMES includes Botanix (3637) and Ink (57073).
Usage: CLI commands accept --chain-id botanix and --chain-id ink. The chains the vault tooling supports (SUPPORTED_CHAIN_IDS) are unchanged.
Fixes
1. Simulated state overrides
Before: VaultSimulator.with_state_override replaced an earlier override of the same account in the same block. A simulated block with no calls was not sent to eth_simulateV1, and its state and block overrides were dropped with it.
Now: overrides of the same account in the same block merge, with fields from the later call winning. Overrides set on an empty block carry into the next block that is sent.
Impact: code that relied on a second override discarding earlier fields of the same account now gets the merged fields.
2. Simulated block timestamps
Now: each sent block without an explicit time advances 12 seconds, and VaultSimulator.current_time returns the modeled time. A block time that does not increase raises ValueError.
Impact: a simulation that sets a block time at or before the previous block’s raises ValueError.
3. Vulnerable dependencies
Before: the lock file pinned versions with published advisories for urllib3, aiohttp, anyio, cryptography, pydantic-settings and pyjwt.
Now: the lock file pins the minimal fixed versions. Only urllib3 is reachable from the SDK, through its RPC and HTTP calls.
Impact: the package’s minimum dependency versions did not change. The first fixed urllib3 version is 2.8.0.
Upgrade with pip install -U ipor-fusion. Full changelog: v3.8.0 on GitHub.
These notes describe changes to the IPOR Fusion SDK. They are not operational or financial advice. Operators are responsible for testing changes against their own vaults and configuration before use.