Skip to main content

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-COMPATIBLE

Vessel 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 getAmountsOut first and sets amountOutMin from that quote minus a slippage bound. A swap that would fill below the bound reverts rather than executing.
  • Every swap carries a short deadline relative 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)AddressActions
PuddleSwap UniswapV2Router020x430c23895c8D44883526e3E0B09327dAD8766660
PuddleSwap UniswapV2Factory0xd498f5beBD0C9f1FE0135a0Cf942dA67Ee6e8A9B
WMON (as used by PuddleSwap)0x97B3070F9Da6C002343862b35E68Bd8e22608943
USDC (as used by PuddleSwap)0x534b2f3A21130d7a60830c2Df862319e593943A3
Vessel engine (router caller)UNVERIFIED — PENDING GATE-0
Single-party addresses

"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.

https://github.com/portdeveloper/puddleswap
https://github.com/portdeveloper/puddleswap/blob/main/config/addresses/10143.json
Verified from: vessel.wtf/litepaper · vessel-repo · vessel-team-brief · puddleswap.org · monad-crypto/protocols · monskills/addresses · docs.monad.xyz — Sat Aug 29 2026 00:00:00 GMT+0000 (Coordinated Universal Time) · How we verify this site →