How did you integrate our partners, if any?

SPONSOR INTEGRATIONS • Chainlink: maxSlippageBps enforced via AggregatorV3Interface in _countViolations() — real-time on-chain price deviation checks without external trust assumptions

• Circle (USDC): Streaming reward pool with per-second accrual — depositRewards(), claimRewards(), setRewardRate() incentivize active LP participation

• Across Protocol (ERC-7683): Cross-chain intent bridging — bridgeIntent() pulls LP USDC, calls Across open(), and re-encodes intent params into the message for re-registration on the destination chain

What are the key links to share? (Ex. demo video, GitHub, deck)

Github: https://github.com/Mosss-OS/IntentLP Slides: https://docs.google.com/presentation/d/1SiUb9Goz4x9cuZ5f3OJrx6HJyIcqJx-5aMI0BJrljdc/edit?usp=sharing Project Link: https://intent-lp-hook.vercel.app Demo Video: https://youtu.be/Asb1BGbTUcQ

Problem / Background: What inspired the idea? What problems are you solving?

Uniswap v4 LPs currently have no on-chain way to control which swaps route through their liquidity. A 0.01 ETH dust swap, a 500 ETH whale dump, and a 3 AM trade during zero-liquidity hours are all treated identically. This uncontrolled toxic flow is the primary source of impermanent loss that hasn't been solved at the hook layer.

Impact: What makes this project unique? What impact will this make?

  1. Penalty fees instead of hard blocks — Most hooks either block swaps or let everything through. IntentLP applies a proportional penalty fee (up to 30 bps) when conditions are violated. The pool stays always accessible, but toxic flow becomes economically unattractive for the swapper and profitable for the LP.

  2. No external dependencies for core logic — Volume tracking uses a 24h on-chain exponential decay formula. No keeper, no oracle, no off-chain bot needed for the primary mechanism. The Chainlink feed is optional (only for slippage enforcement).

  3. Three sponsor integrations in a single hook — Chainlink (slippage feeds), Circle (streaming USDC rewards), and Across Protocol (cross-chain bridging). Most submissions target one sponsor — IntentLP targets three without compromising the hot path.

  4. Gas-optimised hot path — beforeSwap has zero external calls. Volume tracking was moved to afterSwap, saving ~25K gas per swap. The penalty calculation is a single SLOAD + arithmetic.

  5. Full-stack product — Deployed contracts + React frontend + The Graph subgraph + SwapSimulator live preview + cross-chain bridge UI. It's not just a contract — it's a usable application with real-time data.

Challenges: What was challenging about building this project?

  1. Uniswap v4 beforeSwap fee mechanics — The 0x400000 flag to signal fee overrides to PoolManager was poorly documented. Figuring out how to return a BeforeSwapDelta with a proportional penalty fee (not a flat one) took multiple rounds of reading the v4 core source and testing on a fork.

  2. PoolKey encoding consistency — The PoolId derived from keccak256(abi.encode(PoolKey)) needed to match identically between Solidity (via toId()) and the frontend (via viem's encodeAbiParameters). A single field ordering mismatch would silently read wrong data. Had to verify with cast on every deploy.

  3. Multiple sponsor integrations without bloating the hot path — Adding Chainlink price feeds, USDC rewards, and Across bridging without making beforeSwap expensive was a constant constraint. The solution was deferring volume tracking to afterSwap and keeping Chainlink lookups conditional (only when the LP sets a slippage bound).

  4. Reward accrual edge cases — _accrueRewards() must handle the case where activeIntentCount changes between accrual calls (LPs register/deactivate mid-cycle). The division accrued / numActive also required careful ordering to avoid rounding consistently favoring late-claiming LPs.

  5. Gas optimization under time pressure — Moving volume updates out of beforeSwap saved ~25K gas but required restructuring the entire swap lifecycle flow in the contract, which broke existing tests and forced a redeploy.