Sherpa.fun

04 — Docs

How Sherpa.fun
works

What launching a coin against another coin means, what decides what you can pair with, and where every fee goes.

Contracts

Sherpa.fun runs on Avalanche C-Chain, chain ID 43114, deployed on 21 September 2026 at block 95,820,124. Each address below is verified on Snowtrace, so the code behind the link is the code that runs. Any other address presented as one of these is not.

$SHERPA

There is no protocol token yet. When there is, it will be its own contract rather than a coin launched from PairLaunchpad, and its address will be published here first.

Your coin's own contract

Every coin launched here is a PairToken, and every one of them shows as verified without anyone submitting it. That is not a courtesy — PairToken takes no constructor arguments (it calls back into the launchpad for its name, symbol and supply), so the creation bytecode is byte-identical every time. One instance was verified; the explorer matches all the others, including coins that do not exist yet.

What that verified source says, and what it therefore cannot do: fixed supply set once in the constructor, no mint function, no transfer tax, no blacklist, no pause, no owner.

External contracts it uses

Every one of these was read off Avalanche before it was written down — the factories through their own interface, the feeds by description, and Uniswap V4's helpers by asking each for its poolManager().

Uniswap V4 PoolManager (launch venue — every launch's pool lives inside it)0x06380C0e0912312B5150364B9DC4542BA0DbBc85
Uniswap V4 StateView (how the app reads a pool's price and the vault's position)0xc3c9e198C735a4b97e3e683f391cCBDD60B69286
Uniswap V4 Quoter (prices the trade panel; simulated, never sent)0xbE40675BB704506a3c2Ccfb762DCFd1e979845C2
Uniswap V3 factory (measurement only)0x740b1c1de25031C31FF4fC9A62f554A55cdC1baD
Pharaoh concentrated factory (measurement only)0xAE6E5c62328ade73ceefD42228528b70c8157D0d
Pangolin V3 factory (measurement only)0x1128F23D0bc0A8396E9FBC3c0c68f5EA228B8256
LFJ V1 factory (measurement only)0x9Ad6C38BE94206cA50bb0d90783181662f0Cfa10
Uniswap V2 factory (measurement only)0x9e5A52f57b3038F1B8EeE45F28b3C1967e22799C
Pangolin factory (measurement only)0xefa94DE7a4656D787667C749f7E1223D71E9FD88
SushiSwap V2 factory (measurement only)0xc35DADB65012eC5796536bD9864eD8773aBc74C4
Pharaoh classic factory (measurement only)0x85448bF2F589ab1F56225DF5167c63f57758f8c1
Chainlink AVAX/USD0x0A77230d17318075983913bC2145DB16C7366156
Chainlink BTC/USD0x2779D32d5166BAaa2B2b658333bA7e6Ec0C65743
Chainlink ETH/USD0x976B3D034E162d8bD72D6b9C989d545b839003b0

Calls worth knowing

Before launching

// Non-reverting. Returns whether it would be allowed, and why not if not.
registry.status(address quote)
  returns (bool eligible, Decision decision, Report report)

// The bar this particular asset has to clear — $10,000 if listed, $25,000 if not.
registry.requiredDepthUsdE8(address quote) returns (uint256)

Launching

launchpad.launch(LaunchConfig cfg) payable returns (address token, bytes32 poolId)
launchpad.predictToken(address creator, bytes32 salt) returns (address)
launchpad.launchFee() returns (uint256)

LaunchConfig carries, beyond the obvious:

fieldwhat it does
lpFee / tickSpacingthe pool's fee, in hundredths of a bip, and its tick spacing. V4 has no fee tiers: any fee inside minLpFee..maxLpFee (never above 10%) with any spacing from 1 to 1000, and both ticks multiples of it
creatorBpsshare of supply kept back for you, capped at 20%
feeRoute0 keeps your fees, 1 buys the coin back and burns it
feeRecipientzero means the launching wallet
devBuyQuotepair-asset amount spent buying your own coin as the pool's first trade; needs an approval to the launchpad first
devBuyMinOutleast you will accept from that buy — nobody can front-run it, so this guards against you and the pool disagreeing on the opening price

After launching

// Anyone can call. Proceeds only ever reach the recorded recipient, the sink and the treasury.
feeVault.collect(address token)

// Creator only. Both take effect from the next collect.
feeVault.setFeeRoute(address token, FeeRoute route)
feeVault.setFeeRecipient(address token, address recipient)

// Reads
launchpad.launchOf(address token)                              // a public mapping: an unnamed tuple
feeVault.launchOf(address token) returns (Launch)              // includes the pool's full PoolKey
feeVault.positionOf(address token) returns (uint128 liquidity) // a V4 position keeps no tokensOwed
feeVault.feeRouteOf(address token) returns (FeeRoute)
feeVault.feeRecipientOf(address token) returns (address)
feeVault.owed(address token, address who) returns (uint256)    // a payout that could not be pushed
feeVault.claim(address token)                                  // collect one

Where the liquidity lock actually lives

There is no lock contract and no locked LP token, because Uniswap V4 has no LP tokens at all. A V4 position only becomes an NFT when Uniswap's PositionManager wraps it; underneath it is a slot in the PoolManager keyed by (owner, tickLower, tickUpper, salt), and the fee vault seeded that slot directly. The usual "liquidity locked" detectors look for LP tokens or position NFTs sent to a burn address or a locker, and here there is nothing of the sort for them to find.

What holds instead is a property of FeeVault, and with its source published you can check it rather than believe it: no code path in the vault ever passes a negative liquidityDelta. Collecting fees calls modifyLiquidity with a delta of exactly zero, which credits the fees earned so far and touches nothing else. There is no withdraw, no emergency exit, and no owner function that adds one. Anyone can read the position with feeVault.positionOf(token), or straight off Uniswap with StateView.getPositionInfo(poolId, feeVault, tickLower, tickUpper, 0). The float cannot come back out — not by the creator, not by us.

Owner powers

The owner can retune the depth bars, the fee bounds, the launch fee, the treasury, the buyback sink, the curated list, the gates and their parameters. It cannot touch a launch's liquidity, change an existing launch's creator share, or redirect a creator's fees.

Ownership transfer is two-step everywhere: a handover that is never accepted leaves the current owner in place rather than sending the protocol to a wrong address.

Today the owner is a single EOA. It should be a multisig behind a timelock, and the contracts do not enforce that themselves.

None of this has been audited.