UniswapV2-compatible routing
Vessel's spot leg can route through IUniswapV2Router02, the public router interface specified by the Uniswap V2 router documentation. That is an interface citation, not a relationship: Vessel has no relationship with Uniswap Labs and none is implied. The venue actually called on Monad testnet is PuddleSwap, a Uniswap-V2-lineage AMM that describes itself, in its own materials, as forked from Uniswap V2 with stock, unmodified contracts, deployed on testnet only, and unaudited. Anything that speaks the IUniswapV2Router02 interface can sit behind this path; PuddleSwap is what sits there today.
Status
INTERFACE-COMPATIBLEVessel targets the IUniswapV2Router02 interface; the concrete venue on testnet is PuddleSwap, and the deployed Vessel route is not publicly verifiable. As of 2026-08-29.
What Vessel uses it for
The router path is the fallback and long-tail spot route. The litepaper names Kuru and Uniswap-style routing together as the spot-leg venues: the CLOB path (see the Kuru page) is the primary route for the long spot position that the short perp leg hedges, and the V2-style router exists alongside it for two jobs:
- Fallback routing when the CLOB path is unavailable or cannot fill at an acceptable price.
- Long-tail pairs that have AMM liquidity but no order book.
Both jobs serve the same invariant: keeping net delta within 1% of gross notional, rebalanced on a band breach or a 4-hour timer.
What is actually wired today
The design wires a V2-style router as the fallback spot path next to the CLOB path. Whether the deployed testnet contracts currently call PuddleSwap's router, which pairs they route, and under what parameters, cannot be verified from public sources: the Vessel repository holds only a README and a LICENSE as of 2026-08-29, with no contracts, ABIs, or deployed addresses. The deployed route is therefore a design-stage claim, not a verified deployment UNVERIFIED — PENDING GATE-0.
The spot leg is also the only part of this story that touches an AMM. The short leg today hedges against SimVenue SIMVENUE — SIMULATED, a simulated venue behind the IVenue interface, and is unrelated to the router path.
Interface
The functions Vessel's engine uses from IUniswapV2Router02, as specified at docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02:
interface IUniswapV2Router02 {
// Swap an exact input amount along `path`; reverts unless the
// output is at least `amountOutMin`. Returns the amounts at each hop.
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
// Read-only quote: the output at each hop for `amountIn` along `path`,
// computed from current reserves. Used to size `amountOutMin`.
function getAmountsOut(
uint amountIn,
address[] calldata path
) external view returns (uint[] memory amounts);
}
Deadline semantics, per the specification: deadline is a Unix timestamp; the router reverts if the transaction is mined after it (block.timestamp > deadline). This is the router's own protection against a transaction sitting in a mempool and executing against reserves that have moved since it was quoted.
Slippage bounds and deadline handling
The following are design commitments for how the engine calls the router. They are not yet publicly verifiable in deployed code.
- Every swap quotes with
getAmountsOutfirst and setsamountOutMinfrom that quote minus a slippage bound. A swap that would fill below the bound reverts rather than executing. - Every swap carries a short
deadlinerelative to the block in which it was built, so a delayed inclusion reverts instead of filling stale. - A reverted rebalance is a no-op on the book. The engine never widens the bound on retry to force a fill.
The numeric slippage bound and the deadline offset are not published UNVERIFIED — PENDING GATE-0. Monad's 300ms block time makes a tight deadline practical, but no specific value is committed to here.
Addresses
Testnet (chain 10143)
The rows below are PuddleSwap's testnet deployment, consistent across its README, its llms.txt, and its config/addresses/10143.json. They are project-published, single-party addresses. No third-party registry vouches for them (PuddleSwap is absent from the monad-crypto/protocols registry), and the deployed bytecode has not been independently checked against stock Uniswap V2.
| Contract (testnet) | Address | Actions |
|---|---|---|
| PuddleSwap UniswapV2Router02 | 0x430c23895c8D44883526e3E0B09327dAD8766660 | |
| PuddleSwap UniswapV2Factory | 0xd498f5beBD0C9f1FE0135a0Cf942dA67Ee6e8A9B | |
| WMON (as used by PuddleSwap) | 0x97B3070F9Da6C002343862b35E68Bd8e22608943 | |
| USDC (as used by PuddleSwap) | 0x534b2f3A21130d7a60830c2Df862319e593943A3 | |
| Vessel engine (router caller) | UNVERIFIED — PENDING GATE-0 |
"Verified" here means the four addresses agree across PuddleSwap's own published sources. It does not mean any registry, explorer label, or audit vouches for them. Confirm code presence yourself before relying on them; see below.
Mainnet (chain 143)
PuddleSwap has no mainnet deployment. No mainnet address is published for it on this page, and none should be expected.
For ecosystem context only: the monad-crypto/protocols registry (github.com/monad-crypto/protocols) lists Uniswap-protocol V2 deployments on Monad mainnet, including a V2Router02 at 0x4b2ab38dbf28d31d467aa8993f6c2585981d6804. That is evidence that IUniswapV2Router02-interface routing exists on mainnet. It is not a Vessel dependency, and Vessel has no mainnet deployment to route through it.
Verify it yourself
Confirm the factory is deployed and knows the WMON/USDC pair on testnet. A non-zero return from getPair means the pair contract exists; a zero address means it does not.
# Code presence at the router and factory
cast code 0x430c23895c8D44883526e3E0B09327dAD8766660 --rpc-url https://testnet-rpc.monad.xyz
cast code 0xd498f5beBD0C9f1FE0135a0Cf942dA67Ee6e8A9B --rpc-url https://testnet-rpc.monad.xyz
# Pair lookup: factory.getPair(WMON, USDC)
cast call 0xd498f5beBD0C9f1FE0135a0Cf942dA67Ee6e8A9B \
"getPair(address,address)(address)" \
0x97B3070F9Da6C002343862b35E68Bd8e22608943 \
0x534b2f3A21130d7a60830c2Df862319e593943A3 \
--rpc-url https://testnet-rpc.monad.xyz
# Quote 1 WMON -> USDC through the router
cast call 0x430c23895c8D44883526e3E0B09327dAD8766660 \
"getAmountsOut(uint256,address[])(uint256[])" \
1000000000000000000 \
"[0x97B3070F9Da6C002343862b35E68Bd8e22608943,0x534b2f3A21130d7a60830c2Df862319e593943A3]" \
--rpc-url https://testnet-rpc.monad.xyz
Cross-check the same addresses on a testnet explorer: testnet.monadvision.com or testnet.monadscan.com. Note that eth_call on Monad simulates against speculative state; for a quote that is fine, since the next block can move reserves anyway.
What you cannot verify from here is whether Vessel's engine calls this router. That requires the engine address, which is not published.
Failure mode
If the router is unavailable (the venue is down, its pairs are drained, or every swap reverts on the slippage bound), the fallback spot path is gone. On its own that is tolerable: the CLOB path remains the primary spot route and rebalancing continues through it.
If the CLOB path is also impaired at the same time, the spot leg cannot rebalance. The short leg keeps moving with the market while the long leg is frozen, so net delta drifts out of the 1% band. The engine's response is to de-risk toward neutral, reducing the short leg to match what the spot leg can actually hold, rather than adding leverage or forcing a fill at a worse price. This is the same rule that governs a margin-buffer breach: automatic de-risking, never added leverage. Yield stops accruing while the book is unbalanced; principal is not put at additional risk to chase it.
PuddleSwap is unaudited software on a testnet, by its own description. A router-level defect would surface as failed swaps, which the slippage bound and deadline convert into reverts. Because the engine's rebalance is atomic per swap, a revert leaves the book where it was.
Links
- Interface specification: docs.uniswap.org/contracts/v2/reference/smart-contracts/router-02 (a specification reference; no affiliation).
- Kuru, the primary spot route: Kuru integration page.
- Address registry (ecosystem context): github.com/monad-crypto/protocols.
- Testnet explorers: testnet.monadvision.com, testnet.monadscan.com.
- PuddleSwap has no entry in the site link registry, so its site, app, repository, and addresses file are not linked from prose. The repository and addresses file are reproduced here as plain text:
https://github.com/portdeveloper/puddleswap
https://github.com/portdeveloper/puddleswap/blob/main/config/addresses/10143.json