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
| HyperEVM | Elysium | |
|---|---|---|
| Venue | Uniswap V4 | |
| Paired with | WHYPE (wrapped HYPE) | |
| Gas | HYPE | |
| Supply per chain | 1,000,000,000 — all minted into the pool at launch | |
| Start valuation | 35 HYPE | |
| Graduation | 600 HYPE valuation · ≈ 111 HYPE bought in · ~76% sold | |
| Pool fee | 1%, shared between the protocol and the creator | |
| Swap tax | 0–10% buy and sell, set by the creator at launch · shared between the creator and the protocol | |
| Sniper tax | 99% in the launch second, decaying to 0% within 3 seconds | |
| Token address | identical 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.
| Hook | 0x49795f5c92d3a3D05d314fb4CC60eB8c2d37a044HyperEVMElysium |
| Factory | 0xf5cf711614FC25a486Fb87EB23f05d2E02a543a8HyperEVMElysium |
| Locker | 0x80c2B1C87899dE650A9E3AB8677b21d01D29f95CHyperEVMElysium |
| Token implementation | 0x74CCE6Ae6Fb664d28448a8aa9d03f8A9350c3159HyperEVMElysium |