# Periphery

#### WarpRouter02 (Router)

Source: `packages/periphery/contracts/WarpRouter.sol` implementing `IWarpRouter02`.

State: immutable `factory()` and `WETH()` addresses; reverts if `deadline < block.timestamp` on any user-facing method.

**Liquidity Management**

* `addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin, to, deadline)`
  * Approvals required for both tokens to the router.
  * If the pair does not exist, the router creates it on the fly via the factory.
  * Internally balances desired inputs using `WarpLibrary.quote` so slippage bounds (`amountA/BMin`) must be set around expected ratios.
* `addLiquidityETH(token, amountTokenDesired, amountTokenMin, amountETHMin, to, deadline)` (payable)
  * Wraps native ETH into WETH before forwarding into the pair.
  * Refunds surplus ETH to the sender.
* `removeLiquidity(...)` and `removeLiquidityETH(...)`
  * Transfer LP tokens from the caller to the pair, burn them, and distribute assets to `to`.
  * ETH variant unwraps WETH before final transfer.
* Permit variants: `removeLiquidityWithPermit` + `removeLiquidityETHWithPermit` accept EIP-2612 signatures so integrators can batch approve-and-remove in one call.

**Liquidity for Fee-On-Transfer Tokens**

`removeLiquidityETHSupportingFeeOnTransferTokens` and `removeLiquidityETHWithPermitSupportingFeeOnTransferTokens` handle tokens that tax transfers by re-checking router balances instead of the raw burn return values.

**Swap Entry Points**

All swap functions expect an ordered `path` of at least two addresses. The router handles wiring funds between intermediate pairs and enforces min/max slippage via `amountOutMin`/`amountInMax`. Available combinations:

* `swapExactTokensForTokens`
* `swapTokensForExactTokens`
* `swapExactETHForTokens` (payable)
* `swapTokensForExactETH`
* `swapExactTokensForETH`
* `swapETHForExactTokens` (payable)

Fee-on-transfer safe variants (`swapExactTokensForTokensSupportingFeeOnTransferTokens`, `swapExactETHForTokensSupportingFeeOnTransferTokens`, `swapExactTokensForETHSupportingFeeOnTransferTokens`) read the received balance instead of trusting pair outputs.

**Pricing Helpers**

Integrators can quote trades or rebalance liquidity without touching the chain via:

* `quote(amountA, reserveA, reserveB)` – deterministic price quote.
* `getAmountOut(amountIn, reserveIn, reserveOut)` and `getAmountIn(amountOut, reserveIn, reserveOut)` – expose the 0.30% fee curve.
* `getAmountsOut(amountIn, path)` and `getAmountsIn(amountOut, path)` – chain-aware quoting across multiple hops.

These mirror functions in `WarpLibrary` so any SDK code can reuse the same math off-chain.

#### WarpRouter01

`packages/periphery/contracts/WarpRouter01.sol` is a slimmer router that omits fee-on-transfer helpers. Use it only if you require a byte-identical clone of the Uniswap v2 router v1 interface; otherwise `WarpRouter02` (above) is the canonical deployment.

#### WarpMigrator

Source: `packages/periphery/contracts/WarpMigrator.sol`

Single `migrate(token, amountTokenMin, amountETHMin, to, deadline)` entrypoint:

1. Pulls the caller’s entire V1 LP position from the V1 exchange (requires prior approval to the migrator).
2. Removes V1 liquidity and captures the token/ETH amounts.
3. Approves the v2 router for those tokens and adds v2 liquidity via `addLiquidityETH`, respecting the caller’s min amounts.
4. Refunds any excess tokens or ETH back to the caller.

Route bonding-curve graduates or legacy LPs through this migrator to seed v2 pools atomically.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.warpx.exchange/for-developers/warpx-v2/periphery.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
