01What Wave is
Wave is a token launchpad on GIWA, the Ethereum L2 built by Upbit's operator Dunamu on the OP Stack. One transaction creates a coin, mints its entire supply into a Uniswap V4 pool priced in native ETH, and locks that position forever. From the first block anyone can buy and sell against the curve; fees are charged in ETH inside each swap and paid out in ETH. There is no migration step, no team allocation and no way for Wave to withdraw liquidity.
GIWA is currently live as the Sepolia testnet. Everything on this site runs there: the ETH involved is test ETH from the faucet, and prices in USD are derived from the mainnet ETH price so the curve behaves like it will on mainnet.
02At a glance
| Chain | GIWA Sepolia (chain id 91342), OP Stack, 1 s blocks |
|---|---|
| DEX | Uniswap V4 PoolManager, LP fee 0, tick spacing 200, one shared hook |
| Quote asset | Native ETH (currency0); the coin is currency1 |
| Supply | 1,000,000,000 tokens, 18 decimals, all minted into one locked curve position |
| Start → graduation | Fully diluted value set on the factory in ETH, pegged to about $2.5k → $45k at the mainnet ETH price |
| Creator tax | 0–10% on buys and 0–10% on sells, fixed at start, charged in ETH |
| Sniper guard | Optional, chosen at start: 99% in the first second, decaying to 0% within 3 seconds; the creator's own first buy is exempt |
| Liquidity | Owned by an immutable locker; never withdrawn, never migrated |
| Coin address | Always ends in 5ea5, mined in your browser before you sign |
03GIWA Sepolia
Add the network to any EVM wallet with these values; the connect button on this site does it for you.
| Network name | GIWA Sepolia |
|---|---|
| Chain id | 91342 |
| RPC | https://sepolia-rpc.giwa.io |
| Currency | ETH (18 decimals) |
| Explorer | https://sepolia-explorer.giwa.io |
| Faucet | https://faucet.giwa.io — 0.005 test ETH per day, after a short proof-of-work in the browser |
| Bridge | Sepolia ETH can also be bridged in through the standard OP Stack bridge; see the GIWA docs |
GIWA is an optimistic rollup: fees are an L2 execution part plus an L1 data part, both paid in ETH. Gas on the testnet is around a thousandth of a gwei, so a start costs well under a cent and a swap a fraction of that.
04Starting a coin
Starting is one call to WaveFactory.launchToken. In order, the transaction:
- Deploys a minimal-proxy clone of the token implementation at a CREATE2 address committed to your metadata and ending in
5ea5. - Initialises it with the name, symbol, image URL, description and links; the whole supply is minted to the factory.
- Initialises the Uniswap V4 pool at the start price and registers it with the hook (your tax rates and the graduation tick).
- Hands the supply to the locker, which mints one one-sided position from the start tick down to the minimum tick. Nothing else ever adds or removes liquidity.
- Records your payout wallet if you set one.
- If you sent ETH beyond the start fee, buys with it through the router in the same transaction. That buy is never charged the sniper guard and the tokens go straight to your wallet.
Metadata and the address
The salt is keccak(deployer ‖ userSalt ‖ keccak(params)), so the address depends on the name, symbol, image, description and links. Changing any of them after mining restarts the search; the payout wallet is excluded on purpose so you can change it without re-mining. The search runs in your browser, takes a few seconds, and needs no server.
Taxes
Buy and sell taxes are chosen at start, capped at 10% each, and cannot be changed afterwards. They are charged on the ETH side of every swap by the hook and your share accrues in the locker until claimed. A coin with 0 / 0 tax is perfectly valid.
05The curve
Each pool holds exactly one concentrated-liquidity position covering the price range from the start tick down to the minimum usable tick, with the whole supply on the token side and nothing on the ETH side. Because liquidity is constant across that range, buying along it reproduces the familiar constant-product shape: the price in ETH rises smoothly as supply leaves the curve, with no discontinuities and no reserve to migrate.
Prices in the interface are computed locally from the pool's sqrtPriceX96: with the coin as currency1, ETH per token is 1 / (√P)². Market cap is that price times the full supply. For a position with liquidity L, the ETH needed to move from √P₀ to √P₁ is L · (√P₀ − √P₁) / (√P₀ · √P₁), which is what the swap box quotes before the hook's fee is applied.
The start and graduation levels are stored on the factory as fully diluted values in ETH wei (launchConfig). They are expressed in ETH but anchored to dollar targets at the mainnet ETH price; the owner can re-anchor them for future starts when the price moves. Existing pools keep the values they started with.
06Swapping
Swaps go through WaveRouter, a thin contract that unlocks the PoolManager, performs one exact-input swap against the coin's pool and settles. Buys send ETH as msg.value; sells need a one-time ERC-20 approval of the router. Both take a minimum output and a deadline.
buy(PoolKey key, uint256 minOut, address recipient, uint256 deadline) payable
sell(PoolKey key, uint256 amountIn, uint256 minOut, address recipient, uint256 deadline)The pool is a normal Uniswap V4 pool, so any router, aggregator or bot that speaks V4 can trade it directly; the hook applies the same fees regardless of who calls. The swap box uses 2% slippage and a ten-minute deadline by default and warns while a pool's sniper guard is still active.
Every swap emits a Trade event from the router and a Swap event from the PoolManager; the Trades tab on a coin page is built from both.
07Earnings, all in ETH
Fees are taken by the hook inside the swap, on the ETH leg only, so a trader never ends up holding a tax token and sellers receive ETH net of fees.
- Creator tax — the buy and sell rates chosen at start (up to 10% each). The creator's share accrues in the locker.
- Sniper guard — an optional surcharge the creator switches on or off at start. When on, it starts at 99% in the first second and halves repeatedly until it reaches 0% three seconds later, which makes front-running the start pointless. The creator's own first buy inside the start transaction is exempt.
- Protocol fee — a fixed share of every swap that funds Wave. It is already included in every quote shown on the site.
Claiming
The coin page shows the ETH claimable right now and the ETH paid out so far. Anyone may call WaveLocker.claimFees(token); it always pays the creator's payout wallet, never the caller. The payout wallet defaults to the deployer and can be changed by the creator with setFeeRedirect. If a payout wallet rejects ETH (a contract without a receive function), the amount is parked in owed and can be pulled with withdrawOwed.
Fees are held as PoolManager claim tokens (ERC-6909) until claimed and redeemed into native ETH in the claim transaction, so the locker never holds an ETH balance that could be mis-sent.
08Graduation
When a buy pushes the pool price past the graduation level, the hook latches graduated for that pool and emits Graduated. The flag is permanent and purely informational: it is the milestone shown on the board and the coin page, and a signal for aggregators that the coin has real depth.
Nothing changes mechanically. The same pool, the same locked position and the same fees keep working, and the price can keep rising past graduation or fall back below it. There is no second pool, no liquidity migration, no window where trading pauses.
09Liquidity and the locker
WaveLocker is the only liquidity provider in every Wave pool. It has no function to remove liquidity, no owner withdrawal and no upgrade path; its owner can only change where the protocol share of fees is sent. Because the hook rejects pool initialisation from anyone but the factory, nobody can create a competing pool with the same key either.
As tokens are bought, ETH accumulates inside the position and tokens leave it; as they are sold, the reverse. The ETH is always there to buy back every circulating token down to the start price — that is what a one-sided curve with locked liquidity guarantees.
10The token contract
Each coin is an EIP-1167 minimal proxy of WaveToken, a plain ERC-20 with fixed supply, no mint, no blacklist, no transfer tax and no owner. The on-chain record also exposes logo(), description(), socials(), deployer(), poolKey() and poolId() so any front-end can rebuild a coin page from the chain alone. The explorer resolves the proxy to the verified implementation.
Taxes live in the hook, not the token: holding or moving the coin between wallets is free, only swaps against the pool are taxed.
11Bots and developers
Discover coins
Listen for TokenLaunched(address token, address deployer, bytes32 poolId, uint16 buyTaxBps, uint16 sellTaxBps, bool sniperTax, uint256 graduationFdv, uint256 initialBuyAmount) on the factory, or read getLaunchedToken(token) for the position bounds and liquidity. predictTokenAddress and tokenParamsHash let you mine salts off-site.
Read prices
The PoolKey is { currency0: 0x0, currency1: token, fee: 0, tickSpacing: 200, hooks: 0x9A16CF7AfA1c52A9A4F34eA674CdE72bd3e5a0CC }. Read slot0 through PoolManager.extsload at the pool's state slot (the site does exactly this), and quote locally with the formula above; the hook's fee is a flat share of the ETH leg.
Swap
Call WaveRouter.buy / sell as shown above, or swap through the PoolManager directly with your own unlock callback. Hook data is ignored for external callers, and the hook never reverts a swap for size: there are no wallet caps.
Events
| Factory | TokenLaunched, LaunchConfigUpdated |
|---|---|
| Router | Trade(token, trader, recipient, isBuy, amountIn, amountOut) |
| Hook | PoolRegistered, FeeTaken(poolId, toProtocol, toCreator, snipe), Graduated(poolId, token, tick) |
| Locker | PositionLocked, FeesClaimed(token, creator, creatorAmount, protocolAmount), FeeRedirectUpdated |
Note that eth_getLogs on the GIWA RPC is capped at 10,000 blocks per call; page your scans accordingly.
12Data API
The site indexes the chain into a database and serves read-only JSON. Endpoints are unauthenticated and rate-limited by the edge; they are a convenience, not the source of truth — everything in them can be rebuilt from the events above.
GET /api/activity | Every coin with metadata, live curve state, accrued fees, holder and trade counts, 24 h volume, the ETH price and the snapshot time. |
|---|---|
GET /api/tape?limit= | The newest swaps across all coins. |
GET /api/trades?pool= | Most recent swaps for a pool id: side, trader, ETH and token amounts, price after the swap, transaction hash. |
GET /api/holders?token= | Top balances for a coin, folded from Transfer logs. The PoolManager row is the curve. |
GET /api/chart?pool=&since= | Price samples for a pool as sqrtPriceX96 with unix timestamps. |
POST /api/rpc | Same-origin JSON-RPC relay to the GIWA node, used by the site's own wallet client. |
Base URL: https://wavegiwa.fun. Amounts are decimal strings in wei; addresses are lower-cased.
13Trust model
- The token, locker, hook and router are immutable. No pause, no upgrade, no liquidity withdrawal, no mint.
- The factory owner can change the start fee, the start and graduation levels for future starts, the DEX wiring for future starts, and can pause new starts. None of this touches an existing pool.
- The locker owner can change the protocol fee recipient. It cannot redirect a creator's payout or touch the position.
- Creator metadata is immutable once started; only the payout wallet can be changed, and only by the creator.
- The PoolManager on GIWA Sepolia is Wave's own deployment of unmodified Uniswap v4-core, since no canonical one exists on the testnet yet. It is verified on the explorer and has no owner privileges over pools.
- All contracts are verified on the explorer; the addresses are listed below.
Wave runs on GIWA Sepolia today and moves to GIWA mainnet when it opens. The contracts are a port of a design already live on another chain, reviewed by the team; an independent audit is planned before the mainnet deployment.
14FAQ
The coin page says "no trades yet" right after I started it.
The indexer runs after each request and once a minute; a start normally shows within a few seconds. Your own transactions trigger an immediate refresh.
Can I change the image or description later?
No. They are part of the address derivation and stored on chain at start. Start a new coin if you need different metadata.
What happens to the ETH in the pool?
It stays in the locked position as the buy-side depth for everyone who wants to sell. Neither Wave nor the creator can withdraw it.
Does Wave list the coin anywhere else?
The pool is a public Uniswap V4 pool on GIWA and is visible to any indexer that reads the PoolManager. Wave does not submit listings on your behalf.
Where does the USD price come from?
From the mainnet ETH price, refreshed about once a minute. On-chain values are always in ETH; USD is display only.
I sent ETH to the coin address by mistake.
The token has no receive function, so a plain ETH transfer to it reverts and nothing is lost. ERC-20 tokens sent there cannot be recovered.
Will this move to GIWA mainnet?
Yes. Wave runs on GIWA Sepolia until the mainnet opens; the same contracts will be deployed there and this site will switch over. Testnet coins do not carry across.
15Contracts
Source is verified on the explorer for each address; the token implementation is linked from any coin's page there.