Documentation

How Duet works.

Duet is a memecoin launchpad that puts the same token, at the same contract address, on HyperEVM and Elysium — two chains, one voice. Every token trades on Uniswap V4 the moment it is created, and all of its liquidity is locked permanently in an immutable contract that no party — Duet included — can withdraw from.

At a glance

HyperEVMElysium
VenueUniswap V4
Paired withWHYPE (wrapped HYPE)
GasHYPE
Supply per chain1,000,000,000 — all minted into the pool at launch
Start valuation35 HYPE
Graduation600 HYPE valuation · ≈ 111 HYPE bought in · ~76% sold
Pool fee1%, shared between the protocol and the creator
Swap tax0–10% buy and sell, set by the creator at launch · shared between the creator and the protocol
Sniper tax99% in the launch second, decaying to 0% within 3 seconds
Token addressidentical on both chains, always ends in …aaaa

One address, both chains

Tokens are deployed with CREATE2 from a factory that itself lives at the same address on both chains (CREATE3 through CreateX). The token's constructor only takes arguments that are identical everywhere — name, symbol, image, description, links and the deployer — while the chain-specific wiring (which PoolManager, which WHYPE) is read back from the factory. Same init code, same salt, same factory: same address.

The salt is bound to the deployer: keccak(deployer, userSalt). Nobody else can claim your address on the other chain, even if they copy every parameter. The frontend searches for a userSalt whose address ends in aaaa; the search starts at zero and is deterministic, so the same salt can be recomputed later from on-chain data when a token is extended to the other chain.

Two supplies, no bridge

Each chain holds its own 1,000,000,000 supply and its own pool. Prices move independently with local demand. Nothing is bridged between them — the shared address is an identity, not a wrapped asset.

Launching

One transaction per chain: you sign once on each, and the wallet is switched for you in between. HYPE is the gas on both, so a wallet funded on one side is a bridge transfer away from the other. You can also pick a single chain and extend to the other later from the token page.

First buy

An optional first buy rides in the launch transaction: the HYPE you send above the launch fee is wrapped and swapped on the fresh V4 pool, and the tokens land in your payout wallet. It is per chain, so you can seed one side and not the other. The first buy pays the creator tax like any other swap but is exempt from the sniper tax.

Curve and graduation

All supply is minted into a single one-sided concentrated-liquidity position starting at a 35 HYPE valuation with no upper bound. Because both chains pair against wrapped HYPE, the curve is literally the same on each: the same amount of buying moves the price by the same amount.

A token graduates on a chain the first time its price reaches a 600 HYPE valuation. Getting there takes roughly 111 HYPE bought into the curve, at which point about 76% of the supply has been sold. The hook latches the flag on-chain and it never resets; the pool and its locked liquidity do not change.

Trading

Trades go through the Uniswap Universal Router in one transaction: HYPE → WHYPE → token to buy and the reverse to sell, with the wrap and unwrap done by the router. The pool pays the 1% pool fee plus the creator's swap tax. Any V4-aware router or aggregator can route the pool too — the hook only taxes, it never blocks a swap, and third parties may add liquidity alongside the locked position.

Swap tax and sniper tax

At launch the creator picks a buy and a sell tax, 0–10% each, fixed forever and identical on both chains. The pool's hook takes it from the output of each swap and parks it in the Locker, where it is shared between the creator and the protocol. On top of that every pool charges a sniper tax that starts at 99% in the launch second and halves roughly every 0.2 s, reaching 0% after 3 seconds. The sniper tax goes entirely to the protocol; the factory's own first buy is exempt.

Fees

The 1% pool fee accrues inside the locked position; the swap tax accrues in the Locker. Anyone can call claimFees for any token; one call collects both, shares the pool fee between the protocol and the creator, and pays each side its tax. The fee split is snapshotted when the position is locked, so a later change to the protocol share never touches existing tokens.

The creator share goes to the payout wallet given at launch (default: the deployer). Only the current payout wallet can redirect it later, per chain, with setFeeRedirect — the protocol owner cannot. If a payout wallet rejects a transfer (for example a blacklisted address), its share is parked in the Locker and can be pulled with withdrawOwed. There is no platform launch fee at the moment; if one is enabled it is shown in the form and paid with the launch.

Trust model

  • Tokens are fixed-supply ERC-20s with no minting, pausing or admin functions.
  • Liquidity is a V4 position owned by the Locker forever. Its only liquidity action is collecting fees; there is no withdrawal path.
  • The hook has no owner and no setters. It only gates pool creation to the factory and takes the tax and sniper tax after each swap; it cannot block swaps, liquidity or transfers.
  • No upgrades. Hook, Factory and Locker are not proxies. A future version is a new deployment.
  • Owner powers are limited to: the launch fee and switch, the curve parameters for future launches, and the protocol fee recipient and shares for future locks. Nobody can change a creator's payout wallet but that wallet.
  • Pre-created pools. The hook rejects any pool initialisation that does not come from the factory, so nobody can front-run a launch with a wrong starting price.

Contracts

Same address on HyperEVM (999) and Elysium (99901). Every launched token is an EIP-1167 minimal proxy pointing at the token implementation, so its code is readable on the explorer the moment it is created.

Hook0x49795f5c92d3a3D05d314fb4CC60eB8c2d37a044HyperEVMElysium
Factory0xf5cf711614FC25a486Fb87EB23f05d2E02a543a8HyperEVMElysium
Locker0x80c2B1C87899dE650A9E3AB8677b21d01D29f95CHyperEVMElysium
Token implementation0x74CCE6Ae6Fb664d28448a8aa9d03f8A9350c3159HyperEVMElysium