What a transfer does
A transfer moves these values from the sender to the recipient:- V2 (constant-product): a chosen amount of
lp_sharesfromlp_shares[from]tolp_shares[to]. Sender keeps any residual. - V3 (concentrated): the entire position at one tick range. The
v3_positionsrow at(pool_id, sender, tickLower, tickUpper)is deleted and reinserted under the recipient’s key.
What a transfer does not do
Owner-keyed accruals stay with the original owner and are never transferred:- Host fees collected as a host (
v3_host_fees) - Integrator fees collected as an integrator (
v3_integrator_fees) - Free balance (
v3_user_pool_balances) - V2 deposit principal accounting (
liquidity.principal)
Lock-follow semantics
The lock travels with the shares. The exact behavior depends on what the recipient already holds in the pool.V3: lock follows whole position
The sender’slp_locks row is rewritten under the recipient’s key with the same lockUntilTimestamp. The recipient cannot withdraw the position until the original expiry (or never, if the lock was indefinite).
V2: lock-follow gated by recipient_pre_shares
V2 stores one lp_locks row per (pool_id, owner) pair, applied to the entire lp_shares[owner] value. A naive lock-follow would let a sender impose their lock terms on the recipient’s pre-existing stake. The server prevents this:
The sender’s residual obeys the same rule: the sender’s lock row is deleted only when their balance reaches zero. Otherwise it stays in place at the original expiry.
The trade-off: a sender cannot guarantee that transferred shares stay locked at the recipient if the recipient already held an unlocked position in the pool. To deliver locked shares to an existing recipient, the recipient must call
lockPosition themselves before or after the transfer.
Failure modes
Replay protection runs at the gateway. A nonce reused inside the dedup window returns 409 before the transfer reaches the settlement service.
Scoping: V2 vs V3
V3 transfers always move the entire position at the named range. There is no partial V3 transfer; the closest equivalent is
decreaseLiquidity followed by sending the unlocked output through Spark.