Skip to main content
A migrate exits one position and enters another in a single build: leave a Uniswap V3 LP and land in an Aerodrome pool, move a lending position between markets, or shift liquidity to a different chain. It is a zap where both ends are positions, srcToken is the position you are leaving and destToken is the position you are entering. It runs on EVM and Solana, same-chain or cross-chain (EVM to Solana and back). Pick a chain below by the position you are leaving; the tabs stay in sync across Setup, Steps, and End-to-end.
positionDetails.nftId identifies the source position you are leaving (NFT-based LP positions like Uniswap V3); poolDetails pins the destination range for a concentrated-liquidity target. On EVM the source position authorizes through Permit2; on Solana there is no approval step, you sign and send the built transactions directly.

Setup

Migrate from a position on Base into a USDC/WETH pool on Base.
Protocol IDs (provider) come from getZapProviders, scoped per chain by getZapChains. Find target pool addresses with getZapPools.

Steps

1

Find the source position

List the account’s open positions for a protocol, then pick the one to migrate out of. Each position carries its address, chainId, amount, and optional nftDetails.
2

Quote

Route from the source position into the target position. srcToken is what you leave, destToken is what you enter. positionDetails.nftId identifies the source NFT to burn. Read-only.
Migrating into a concentrated-liquidity pool? Add poolDetails: { lowerTick, upperTick } to pin the new range, or omit it for the router default. To land on Solana instead, set destChainId: 7565164, destToken to the SPL position, and recipient to a base58 address; keep refundee as your EVM address.
3

Approve

Authorize the source position through Permit2, approving once on-chain only if the allowance is short.
4

Build & execute

Sign the Permit2 PermitSingle, attach the returned permitData, build the route, and execute its steps in one zap() call.
5

Status

Poll to a terminal state. Zap status is uppercase: PENDING, COMPLETED, FAILED, or REFUNDED. status.steps shows the exit and entry legs.

End-to-end

API usage

The zap API lives on https://zap.dzap.io/v1. List positions and check status with GET; quote and build are POST. srcToken is the old position, destToken is the new one; NFT sources add positionDetails.

Notes

  • Cross-chain migrate: srcChainId and destChainId are independent, so any pair works (EVM to EVM, EVM to Solana, Solana to EVM). recipient is an address on the destination chain, refundee on the source chain. Expect bridge latency.
  • NFT source: pass positionDetails.nftId for the position you are leaving. Fungible LP/vault sources omit it.
  • CL destination: pass poolDetails: { lowerTick, upperTick } to pin the new range, or omit for the router default.
  • Slippage: a two-sided move (exit + entry) has more surface for slippage; 1-2% is a safe default.
Read more in Fuse execution flow.
Last modified on September 18, 2026