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.
| contract | address |
|---|---|
PairLaunchpad | 0x2d05d4Ba03ac1d7b355974C19b7839Afb8b370d1 |
FeeVault | 0xD3C2edAd7FA9D597ac182cD3a545b952964B680B |
QuoteRegistry | 0xaD4EB197d33b29A5d4bd89e005Cd57A21B2C1b53 |
CompositeQuoteGate | 0xfD3e2040682E848Fd690B50e9552F50fF6EE3DDb |
UniV3QuoteGate (Uniswap V3) | 0xceA94E71958dC082Ed35AD39C5929B30b7DBfbbe |
UniV3QuoteGate (Pangolin V3) | 0x323A0730f7eb00446613B4D26fccaE1dE42E2E12 |
PharaohQuoteGate | 0xBa12a38aAE0241097D71Bec26166fF995482f8d6 |
V2QuoteGate | 0x0481aCC86a78e99fACBF220eEad1222A0bFcFDf4 |
$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/USD | 0x0A77230d17318075983913bC2145DB16C7366156 |
| Chainlink BTC/USD | 0x2779D32d5166BAaa2B2b658333bA7e6Ec0C65743 |
| Chainlink ETH/USD | 0x976B3D034E162d8bD72D6b9C989d545b839003b0 |
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:
| field | what it does |
|---|---|
lpFee / tickSpacing | the 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 |
creatorBps | share of supply kept back for you, capped at 20% |
feeRoute | 0 keeps your fees, 1 buys the coin back and burns it |
feeRecipient | zero means the launching wallet |
devBuyQuote | pair-asset amount spent buying your own coin as the pool's first trade; needs an approval to the launchpad first |
devBuyMinOut | least 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.
