Docs

How Arcopad works

Everything about launching, trading and earning on Arcopad: what happens on-chain, where every fee goes, what the contracts can and cannot do, and how to build on top of them.

Supply

1B

fixed, 100 % in the pool

Pool fee

1 %

Uniswap v4, no hook

To the creator

80 %

of every trading fee

Launch cost

≈ $0.03

gas only, paid in USDC

Overview

Arcopad is a token launchpad on Arc (chain ID 5042), Circle’s stablecoin-native L1 where gas is paid in USDC. One transaction deploys a fixed-supply ERC-20, opens a TOKEN / USDC Uniswap v4 pool, puts the entire supply in it and locks the liquidity position for 2, 5 or 10 years.

There is no bonding curve, no migration and no graduation step: the token trades on Uniswap from its first block, against native USDC, with a price quoted in dollars. The creator earns 80 % of the pool’s trading fees for the life of the lock; the other 20 % goes to the protocol, and its USDC part is streamed to $ARCO stakers.

One transaction

Deploy, create the v4 pool, seed it, lock the LP and optionally buy, atomically.

Fair start

No presale, no team allocation: 100 % of the supply goes into the pool.

Locked liquidity

The LP position sits in the Arcopad locker for 2, 5 or 10 years.

80 % to creators

Every trade pays 1 %; 80 % of it goes to the creator’s fees recipient.

USDC for stakers

The protocol’s USDC share is streamed to $ARCO stakers over 7 days.

Plain ERC-20

No tax, no mint, no proxy, owner renounced, source auto-verified.

Arc chain

Arcopad runs only on Arc mainnet. Arc is EVM-compatible, so any wallet that supports custom networks works; the difference is that the native gas token is USDC instead of ETH.

Chain ID
5042
Native token
USDC18 decimals as msg.value, like ETH
Finality
Sub-seconddeterministic, no reorgs to wait for
Min base fee
20 gwei≈ $0.00002 per 1,000 gas
Public RPC
rpc.mainnet.arc.io
Explorers
explorer.arc.io · arc.etherscan.io
USDC (ERC-20 view)
0x3600…0000same balance, 6 decimals

Two views of the same USDC

On Arc, your native balance and the ERC-20 at 0x3600000000000000000000000000000000000000 are the same funds: the native side uses 18 decimals, the ERC-20 side 6. Arcopad pools pair against native USDC (currency0 = address(0)), so buying needs no approval and settles in a single transaction. If you integrate, never mix the two decimal bases.

Launching a token

From Create, fill in a name, ticker, description and logo, choose a starting market cap and a lock duration, optionally add a first buy, and sign once. The app calls ArcopadLaunchpad.launch(), which does all of this atomically:

  1. 1Deploys a full ArcopadToken contract via CREATE2 and mints the whole 1,000,000,000 supply to the launchpad in its constructor.
  2. 2Initialises a Uniswap v4 pool TOKEN / native USDC, 1 % fee, tick spacing 200, no hook, at the price that matches your starting market cap.
  3. 3Mints a single-sided position holding 100 % of the supply, from the starting price upward, so no USDC is needed to seed it.
  4. 4If you attached USDC, runs your first buy on the fresh pool and sends the tokens to your wallet. Nobody can buy before you: it is the same transaction.
  5. 5Transfers the LP position NFT to the ArcopadLpLocker with your lock date and fees recipient, refunds any rounding dust, records the launch and emits Launched.
Launch fee
Noneyou only pay gas, ≈ 1.6M gas ≈ $0.03
Supply
1,000,000,000fixed, all of it in the pool
Pool
Uniswap v4 · 1 % · spacing 200hooks = address(0)
Lock
2, 5 or 10 yearschosen at launch, cannot be shortened
First buy
Optional, in USDCkeep ~0.1 USDC aside for gas
Fees recipient
Your wallet by defaultany address; fixed for the lock
Name / ticker
≤ 32 chars / 1–8 [A-Z0-9]description ≤ 256 chars
Right after the launch, the app asks the server to verify the token’s source on Etherscan, and retries whenever the token page is opened. Scanners and explorers show a readable, verified ERC-20 within minutes.

Starting price

The starting market cap sets the pool’s opening price. With a fixed 1B supply, price and market cap are the same number read differently: a $5,000 start means one token costs $0.000005. The pool’s starting tick is the multiple of 200 closest to that price, so the real figure lands within a percent of the preset.

$2,500
tick 129,000≈ $0.0000025 per token
$5,000
tick 122,000≈ $0.0000050 per token · default
$10,000
tick 115,200≈ $0.0000099 per token
$25,000
tick 106,000≈ $0.0000249 per token
price maths
// token = currency1, native USDC = currency0 (both 18 decimals)
tokensPerUsdc(tick) = 1.0001 ^ tick
startTick           = round(log(supply / marketCapUsd) / log(1.0001) / 200) * 200
marketCap(tick)     = supply / 1.0001 ^ tick
marketCap(sqrtP)    = supply / (sqrtPriceX96 / 2^96)^2

How the price moves

The whole supply sits in one range that starts at the launch price and extends to the top of Uniswap’s price scale. Buys add USDC to the pool and push the price up along that range; sells take USDC out and bring it back down.

The pool holds no liquidity below the launch price, so the price can never go under it: if every holder sold, the pool would be back exactly where it started, holding all the tokens and none of the USDC.

The token contract

Every launch deploys the same contract, ArcopadToken: an OpenZeppelin ERC-20 whose supply is minted once, in its constructor. It is a real contract at the token address, not a minimal-proxy clone, so explorers show its own source and bytecode scanners find nothing that can mint.

Standard
ERC-20 (OpenZeppelin)18 decimals
Mint
Nosupply created in the constructor only
Tax / fees on transfer
Notransfers move exactly what you send
Blacklist / pause
Nono admin functions at all
Proxy / upgrade
Nofull contract, immutable
Owner
0x000…000Ownable, renounced in the constructor
Address
CREATE2 from the launchpadsalt mixes your random entropy

Why owner() exists if there is no owner

Auditing tools read owner(). A contract without it can’t be told apart from one hiding an owner, so ArcopadToken inherits Ownable and renounces it in the same constructor: owner() returns the zero address from the first block.

Why the token address is not predictable

Arc has no on-chain randomness (prevrandao is always 0). If a token address could be computed in advance, someone could initialise its v4 pool first, at another price, and make the launch revert. The CREATE2 salt therefore mixes 32 random bytes from your browser with your address, the block number and a nonce. A reverted launch never burns an address: retry and a new one is drawn.

Trading

Each token page has a swap panel that routes through Uniswap’s UniversalRouter on Arc and quotes with the V4Quoter. The pool is a regular Uniswap v4 pool, so any v4-aware wallet, aggregator or bot can trade it too.

Buying

Pools are quoted in native USDC, so a buy is one transaction with no approval: the USDC is sent as the transaction value.

Selling

  1. 1Approve the token for Permit2, once per token.
  2. 2Allow the UniversalRouter inside Permit2. The app grants it for 30 days, then asks again.
  3. 3Sell. Every later sell is a single transaction until the Permit2 allowance expires.
Router
UniversalRouterV4_SWAP · exact-in single hop
Quote
V4Quoterread on-chain before each swap
Max slippage
1 % · 3 % · 5 %3 % by default, applied to the quote
Pool fee
1 %taken from the input side of each trade

Fees

The only fee on Arcopad is the pool’s 1 % Uniswap fee. There is no launch fee, no transfer tax and no hidden cut. As in every Uniswap pool, the fee is paid in whatever the trader puts in: buys pay in USDC, sells pay in the token. Fees accumulate on the locked position and are split when collected:

80% Creator

the launch’s fees recipient, in USDC and tokens

20% Protocol

USDC → $ARCO stakers · tokens → treasury

example
Trading volume on a token: 10,000 USDC of buys, 10,000 USDC worth of sells

Buys  → fee 1 % = 100 USDC
          creator  (80 %) =  80 USDC   → fees recipient
          stakers  (20 %) =  20 USDC   → ArcopadStaking, streamed over 7 days

Sells → fee 1 % = 100 USDC worth of the token
          creator  (80 %) =  80 USDC worth of tokens → fees recipient
          treasury (20 %) =  20 USDC worth of tokens → Arcopad treasury
  • Fees are collected with ArcopadLpLocker.collectFees(nftId), from the token page or directly. Collecting works at any time, even while the liquidity is locked.
  • Anyone may call it: the split is hard-coded, so the caller cannot redirect anything. It just saves the creator a transaction.
  • If a recipient cannot receive native USDC (a contract without receive(), for example), its share is parked in pendingNative and withdrawn with claimPending(), so one bad recipient never blocks the others.
The fees recipient is written into the lock at launch and there is no function to change it. If you want fees to go to a multisig or a vault, set it in the launch form.

Liquidity lock

The LP position is a Uniswap v4 NFT. The launchpad never holds it past the launch transaction: it goes straight into the ArcopadLpLocker, which records three things: the owner (the creator), the fees recipient, and the unlock date.

Durations
2 · 5 · 10 years10 years by default in the form
While locked
Fees collectiblethe liquidity itself cannot move
Countdown
On the token pagelockInfoByToken(token)
After unlock
Owner withdrawswithdraw(nftId) returns the NFT to the creator
Extend / shorten
Not possiblethe date is set once

What unlocking means

After the unlock date, the creator gets the LP position back and can remove the liquidity. A 10-year lock is the strongest commitment; buyers can see the exact date on every token page. See also the administrator’s emergency path under Admin & trust.

$ARCO staking

Real yield

$ARCO is Arcopad’s platform token, launched on Arcopad itself like any other token. Staking it on the Stake page earns the protocol’s 20 % share of the USDC fees from every Arcopad pool, paid in native USDC, pro rata to your stake.

  1. 1A fee collect on any Arcopad pool sends the protocol’s USDC share to ArcopadStaking.
  2. 2Each deposit is streamed over 7 days, merged with whatever is still streaming.
  3. 3Every second, the stream is shared among stakers in proportion to their stake.
  4. 4You claim whenever you like; exit() unstakes and claims in one call.
Reward
Native USDCnot inflation, not the staked token
Streaming
7 days per depositSynthetix StakingRewards model
Lock-up
Noneunstake at any time
APR
On the Stake pagelive stream rate ÷ value staked
Idle time
Not lostrewards streamed while nobody stakes roll into the next stream

Why rewards stream instead of landing at once

Fee collects are public and arrive in lumps. If they were credited instantly, someone could stake right before a collect, trigger it, and leave right after with a share they never waited for. Streaming means a reward only accrues to stake that is present while it streams.

Metadata & logos

Arcopad has no backend database and no IPFS pinning service. Each launch stores its metadata on-chain, in the launch record, as a small JSON string of at most 2,048 bytes:

launch.metadata
{
  "description": "What this token is about",
  "image": "data:image/webp;base64,UklGR…",   // square logo, ≤ 96 px
  "socials": ["https://x.com/yourtoken"],
  "website": "https://yourtoken.xyz"
}

The logo you upload (up to 5 MB) is cropped to a square in your browser and re-encoded, shrinking size then quality until it fits the remaining bytes. Very detailed images may not fit; a simpler logo always will.

Because everything lives on Arc, a token’s page, logo and links load straight from the chain and stay up as long as the chain does.

Contracts & addresses

Arc mainnet

Arcopad’s contracts are immutable: no proxies, no upgrade path. Click an address to open it on the Arc explorer.

Arcopad

ArcopadLaunchpad

Deploys tokens, creates and seeds pools, launch registry

ArcopadLpLocker

Holds LP NFTs, splits fees 80 / 20, unlocks

ArcopadStaking

$ARCO staking, streams USDC rewards

Uniswap v4 & infrastructure on Arc

PoolManager

Every v4 pool lives here

PositionManager

LP position NFTs

UniversalRouter

Swaps from the app

StateView

Pool price reads (getSlot0)

Permit2

Token allowances for sells

USDC (ERC-20 view)

6 decimals, same funds as native

Admin & trust

What each contract lets anyone, including the Arcopad team, do. Nothing here is hidden behind a proxy.

ArcopadLaunchpad
No ownerpermissionless, holds nothing between calls
ArcopadToken
No ownerrenounced at deployment, nothing to call
ArcopadStaking
Owner: set $ARCO oncecannot move staked tokens or rewards
ArcopadLpLocker
Owner: see belowcannot change a lock’s owner, recipient or date

What the locker administrator can do

  • Set where the protocol’s 20 % goes (setTreasury, setStakingPool). The creator’s 80 % is hard-coded and untouchable.
  • Move locked positions through an emergency path (emergencyWithdrawMany, emergencyWithdrawManyInOne), meant for migrating to a new Uniswap deployment or rescuing positions if Uniswap on Arc ever breaks.
The emergency path means locks rely on the administrator key as well as on the unlock date. It is disclosed here and visible in the verified source; every use emits an EmergencyWithdraw event that anyone can monitor.

Integration guide

For builders

Everything an explorer, a bot or an aggregator needs is on-chain. No API key, no indexer: the launchpad keeps a registry you can page through, and every pool is a standard Uniswap v4 pool.

1 · List launches

viem
import { createPublicClient, http } from "viem";

const client = createPublicClient({ transport: http("https://rpc.mainnet.arc.io") });

const total = await client.readContract({
  address: LAUNCHPAD, abi, functionName: "totalLaunches",
});
const launches = await client.readContract({
  address: LAUNCHPAD, abi, functionName: "getLaunches", args: [0n, total], // [start, stop)
});

// one token:              launchOf(token)            → Launch (reverts if not an Arcopad launch)
// one creator's tokens:   launchesByCreator(creator) → address[]
Launch record
struct Launch {
  address token;
  bytes32 poolId;         // Uniswap v4 pool id
  uint256 nftId;          // LP position, held by ArcopadLpLocker
  address creator;
  address feesRecipient;  // receives 80 % of fees
  uint64  timestamp;
  uint64  unlockAt;       // lock end, unix seconds
  uint24  fee;            // 10000 = 1 %
  int24   initTick;       // start price
  int24   tickSpacing;    // 200
  uint256 supply;         // 18 decimals
  string  name;
  string  symbol;
  string  metadata;       // JSON, see Metadata
}

2 · Watch new launches

event
event Launched(
  address indexed creator,
  address indexed token,
  bytes32 poolId,
  uint256 nftId,
  uint256 supply,
  uint24  fee,
  int24   initTick,
  int24   tickSpacing,
  uint64  unlockAt,
  string  name,
  string  symbol
);

3 · Price and market cap

pool
// PoolKey: native USDC always sorts first
{ currency0: 0x0000…0000, currency1: token, fee: 10000, tickSpacing: 200, hooks: 0x0000…0000 }

poolId = keccak256(abi.encode(poolKey))      // also stored in the Launch record

StateView.getSlot0(poolId) → (sqrtPriceX96, tick, protocolFee, lpFee)
tokensPerUsdc = (sqrtPriceX96 / 2^96)^2       // both sides have 18 decimals
priceUsd      = 1 / tokensPerUsdc
marketCapUsd  = supply / tokensPerUsdc

4 · Swap

Send UniversalRouter.execute(commands, inputs, deadline) with command V4_SWAP (0x10) and actions SWAP_EXACT_IN_SINGLE, SETTLE_ALL, TAKE_ALL.

Buy
zeroForOne = truemsg.value = USDC in, no approval
Sell
zeroForOne = falsetoken → Permit2, then Permit2.approve(router)
Quote
V4Quoter.quoteExactInputSingleapply your slippage to amountOut

5 · Lock and fees

Lock info
lockInfoByToken(token)nftId, owner, feesReceiver, unlock, seconds left
Collect fees
collectFees(nftId)anyone can call, split 80 / 20
Withdraw
withdraw(nftId)owner only, after unlock
ArcopadLaunchpad.launchExisting(token, amount, params) also lets a contract seed a pool for a token that already exists, with the same lock and fee split. It is not in the app yet.

FAQ

What does it cost to launch?+
Only gas: about 1.6 million gas, around $0.03 in USDC at Arc’s base fee. There is no launch fee. A first buy, if you add one, is on top.
Do I need ETH?+
No. Arc’s gas token is USDC, so a wallet with USDC on Arc is all you need to launch, buy, sell or stake.
Is there a bonding curve or a graduation?+
No. The token trades on its final Uniswap v4 pool from the first block. Nothing migrates, and the pool you see at launch is the pool it keeps.
Is there a buy or sell tax?+
No. The token has no transfer logic of its own and the pool has no hook. The only fee is Uniswap’s 1 % pool fee.
Can the creator pull the liquidity?+
Not before the unlock date shown on the token page. After it, the creator can withdraw the LP position. Separately, the locker administrator has a disclosed emergency path, see Admin & trust.
Can the price drop below the launch price?+
No. The pool has no liquidity below its starting price, so selling can bring the price back to where it started but not under it.
Can someone snipe my launch?+
Not before your first buy: it runs inside the launch transaction, right after the pool is created. And since the token address can’t be computed in advance, nobody can prepare the pool ahead of you.
When do I get my fees?+
Whenever fees are collected, from the token page or by anyone calling collectFees. Your 80 % goes straight to your fees recipient, in USDC for buys and in your token for sells.
Can I change the fees recipient after launch?+
No. It is recorded in the lock at launch and there is no setter. Choose a multisig or vault in the launch form if that is what you want.
Is $ARCO staking locked?+
No. You can unstake at any time. Rewards are native USDC streamed over 7 days after each fee collect, so staying staked is what earns them.
Is my token verified on the explorer?+
Yes. The app submits the source to Etherscan after launch and retries on each visit to the token page until it is verified.

Still have a question?

Ask on Telegram or X, or read the verified contracts.