# Dust-supply rounding enables over-seizure and debt socialization in value-based transfer

Ceil rounding in ERC721WrapperBase value-based transfer lets a liquidator repay 1 unit and seize an entire inflated Uniswap V3 position, socializing the rest as bad debt.

- Payout: Contest reward
- Severity: high
- Program: VII Finance
- Credited: fromeo016
- Disclosed: 2026-03-07
- Write-up quality: 8/10
- Original: https://cdn.cantina.xyz/reports/cantina_competition_vii_finance_jan2026.pdf#3.1.1
- Library page: https://bugbountylibrary.com/r/cantina%3Avii_finance_jan2026%3A3.1.1
- Tags: domain:web3 impact:funds-loss impact:integrity kind:contest platform:cantina sev:high tech:evm tech:solidity technique:source-review vuln:business-logic vuln:liquidation vuln:oracle-manipulation vuln:precision-loss

**Target:** ERC721WrapperBase transfer / EVault liquidation
**Root cause:** transfer(address,uint256) distributes value across tokenIds via normalizedToFull with Math.Rounding.Ceil; when balanceOfTokenId is dust (1 wei) relative to currentBalance, the per-token transfer rounds up to the full ERC6909 balance.
**Steps:**
1. Wrap a Uniswap V3 LP NFT via uniswapV3Wrapper.wrap and enableTokenIdAsCollateral.
2. unwrap(borrower, tokenId, borrower, FULL_AMOUNT - 1, "") leaving balanceOf(borrower, tokenId) == 1.
3. Permissionlessly call nonFungiblePositionManager.increaseLiquidity with large amount0Desired/amount1Desired so the 1-wei-supply position is highly valuable.
4. Borrow ~80% of inflated collateral value from the Euler vault.
5. Drop oracle price on one leg (e.g. `oracle.setPrice(tokenB, unitOfAccount, 0.01 ether)`) to make account liquidatable.
6. Liquidator calls `eTokenAVault.liquidate(borrower, address(uniswapV3Wrapper), 1, 0)`; ceil rounding transfers the full tokenId.
7. executeLiquidation forgives health check and socializes remaining debt as bad debt.
**How found:** Code review of value-based transfer distribution in ERC721WrapperBase: noticed normalizedToFull uses Math.Rounding.Ceil, then reasoned that dust ERC6909 supply combined with permissionless NFPM increaseLiquidity could make a 1-wei balance represent a large position, so ceil rounds a tiny repay into full seizure.
**Exploitation:** Liquidator repays 1 unit; enforceCollateralTransfer invokes wrapper transfer which ceil-rounds to the full ERC6909 balance, seizing the entire inflated LP position. Liquidation then socializes the unpaid remainder, leaving the protocol with bad debt while the liquidator captures valuable collateral for negligible repayment.
**Escalation:** Repeatable across positions to systematically capture LP collateral and shift liability to the protocol and other users.
**Insight:** When a share/value distribution rounds up per-token, check whether external permissionless actions (like NFPM increaseLiquidity) can inflate the value backing a dust share; dust supply plus ceil rounding turns minimal repayment into full collateral seizure.
