Aroma docs
Overview
Aroma is a place to launch and trade coins on Arc. Browse the board, open a coin to see its chart and trades, and buy or sell straight from your wallet.
Every coin launches straight into its own Uniswap v4 pool. There is no separate curve contract and no migration later — the pool is the market from the first block, so the coin shows up anywhere that reads Uniswap, not only here.
Gas on Arc is USDC. That means a price is a price — no second asset to convert through, and no gas token to hold separately. Every figure on the site is dollars.
Aroma never holds your funds. Your wallet signs and submits every transaction, and the contracts have no function that lets us move a token or a balance that is not ours.
Launches
Anyone can launch. It costs nothing but gas, and it is one transaction.
- Name, ticker, and optionally a description, a picture and links. The picture and links are pinned to IPFS; the URI goes on-chain.
- Optionally buy some of your own coin in the same transaction, up to $2,000. This is public — it shows on your coin as a dev holding — and it pays the same fee as anyone else's buy.
- The token deploys with a fixed supply of 1B and no mint function, and the whole supply goes into the pool. Nobody, including us, can create more of it or take it back out.
Trading opens in that same transaction. There is no listing step and no approval from anyone.
Pricing
The whole supply is deposited as single-sided liquidity: a range of prices above the opening price, funded only with the token. As people buy, the price walks up through that range and the pool collects their USDC. Nobody had to provide any USDC to start it.
Within a range, a Uniswap position is a constant-product curve with virtual reserves — the same shape a bonding curve uses. Buying moves the price up, selling moves it down, and early buys move it more than later ones.
- Total supply
- 1B
- In the sale range
- 800M
- In the reserve range
- 200M
- Opening market cap
- $4,312.55
- Where the sale range ends
- $69,005.73
- Where liquidity ends
- $1,104,172
The figures are not round because they are where Uniswap's price ticks actually land, and they are stated as they are rather than rounded to look tidier.
Fees
- Launching
- Free
- Trade fee
- 1% of every buy and sell
- To the creator
- 70% of that fee
- To the protocol
- 30% of that fee
On a $100 trade the fee is $1. The creator gets $0.70 and Aroma gets $0.30.
Every fee is paid in USDC, on buys and sells alike. The pool charges nothing itself; a hook takes the fee from whichever side of the trade is USDC, so no token is ever sold to pay anyone. The fee is part of the pool, which means it applies to every trade whichever app or router sends it.
The creator's share accrues in the contract and they claim it whenever they want. It is visible on the coin's page whether you are the creator or not, and it never stops accruing.
Sale and reserve
The supply is split across two price ranges in the same pool. The first 800M tokens — the sale — are spread from the opening price up to $69,005.73of market cap. The remaining 200M sit above that, continuing the same pool to $1,104,172.
Nothing happens at the boundary. There is no migration, no new pool, no pause and no milestone — trading simply moves from one range into the next, and the only thing that changes is how deep the book is at that price. Other launchpads call this point graduation because on a bonding curve it is where the coin finally reaches a real exchange. Here it reached one in the block it was created, so the word would describe something that already happened.
The first block
Pool launches have no launch tax. A coin is tradeable the moment it exists, and a bot watching for new pools can buy in the very next transaction.
The protection there is, is the creator's own first buy. It runs inside the launch transaction, before anyone else can see the coin, so a creator who wants to buy their own coin cannot be front-run doing it.
If you are buying a coin in the seconds after it launches, you are competing with bots. Check the price you are paying, not only the market cap on the card.
Risks
Coins launched here are made by anonymous third parties. They carry no rights, no claim on anything, and can go to zero. Most do.
- Names and pictures can be copied. Check the contract address, not the name. It is on every coin page.
- The creator can sell. Their holding and their claimed fees are shown on the coin page. Look before you buy.
- Transactions are irreversible. Once a trade is final there is no undo and no support desk that can reverse it.
- Early buyers pay less. That is how the pricing works, not a bug — but it means whoever is already in is up on you the moment you buy.
- The contracts have not been audited. They are tested against Uniswap's own deployed code and they are public, but nobody independent has reviewed them.
Nothing here is investment advice.
Contracts
Three contracts, on top of Uniswap v4's own. Read them rather than taking our word for any of the above.
Deploys a token and launches its pool in one transaction.
Creates each pool, owns every position, and is the pool's hook — the fee lives here.
Buys and sells. Holds nothing between trades.
Uniswap's own singleton. Every pool lives in it.
The liquidity is locked because PoolVault owns every position and has no function that removes liquidity — not one that is guarded, none at all.
The owner key can do exactly two things: withdraw the protocol's share of fees, and set the factory address once at deployment. There is no pause, no upgrade, and no path from the owner to a pool's liquidity or a creator's fees.
The whole thing is public — contracts, indexer and this site — at github.com/matco01/Aroma. Readable and auditable, though not open source: it is under the Business Source License, which converts to MIT in 2030 rather than permitting a competing deployment today.
Trading integration
Every Aroma coin is a Uniswap v4 pool with native USDC as currency0 and the coin as currency1, tick spacing 2, an LP fee of zero, and PoolVault as its hook. Anything that can swap a v4 pool can trade it, and the hook charges its fee whichever route the trade takes.
AromaRouter is the simplest way in, because Uniswap has published no Universal Router for Arc. It keeps sells to one transaction with an EIP-2612 permit instead of Permit2.
buy(address token, uint256 minTokensOut) payableUSDC is the value sent. Tokens go straight to the caller.sell(address token, uint256 amount, uint256 minUsdcOut, uint256 deadline, uint8 v, bytes32 r, bytes32 s)One transaction. The permit's spender is the router.
A trade the pool cannot fill completely reverts. A buy larger than the liquidity left, or a sell of more tokens than ever left the pool, fails with "insufficient liquidity" instead of filling part of it. From launch the pool can take about $69,007 in total.
For a quote, simulate the router call itself with a minimum of zero and read the return value. That runs the real pool, the real fee and the router's own checks, which is what this site does before every trade.
Two shapes are refused by the hook: exact-output sells ("give me exactly N USDC") revert, because charging a fee on an exact output would mean handing back less than was asked for. Every ordinary exact-input buy and sell works.
Indexing
Nothing custom is needed. Watch PoolFactory for new coins and Uniswap's PoolManager for their trades.
PoolFactory · TokenCreated(address token, address creator, bytes32 poolId, string name, string symbol, string description, string metadataUri, uint256 devBuyUsdc)A new coin and its PoolId. token, creator and poolId are indexed.PoolManager · Swap(bytes32 id, address sender, int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint24 fee)Every trade. Filter by id — PoolManager serves every v4 pool on the chain.PoolVault · FeeTaken(address token, uint256 usdc)The exact fee each trade paid, in USDC.
Two details trip people up. A Swap's amounts are net of the fee on a buy and gross of it on a sell, because the hook charges before the swap in one direction and after it in the other. And its sender is the router, not the trader — use the transaction sender, or AromaRouter's own Bought and Sold events, which name the trader.
The price is tokens per USDC in the pool, so a coin getting more expensive moves the tick down, and the sale range ends at tick 95,818.
Network
- Chain
- Arc
- Chain ID
- 5042
- Gas token
- USDC
- Liquidity
- Uniswap v4
Your wallet will be asked to switch to Arc, or to add it if it has never seen it, the first time you trade.
Something wrong or unclear here? Tell us. Back to the board.
