Specie
Arc
Protocol

How a swap settles

One transaction, four actions, nothing held in between. This page is the whole path from a typed amount to a settled trade, including every point where Specie refuses.

1. The quote is a contract read

There is no hosted router for this chain, so a price is never taken from an API. For each pair Specie finds the Uniswap v4 and v3 pools that exist, drops the ones with no liquidity, asks each version's Quoter what your exact amount returns, and keeps the best answer. Most of the depth on Arc sits in v3; the cirBTC pool Specie routes through is one of them. A two hop route through USDC is priced alongside the direct one and wins if it returns more.

Pools that are initialised but empty are the trap on a young chain. They quote without reverting and hand back a fraction of the fair amount, so every quote is measured against the pool's own mid, taken by pricing one unit in the same direction.

2. Price impact, measured against the pool

Nothing outside Arc quotes these pools, so there is no venue price to compare against and Specie does not invent one. The reference is the pool itself, and the panel shows how far your size lands under that mid. The API returns this as lossPercent with reference: "pool-mid".

Hard refusal at 3%. An order that would land more than 3% under the pool's own mid is refused before any signature, on both endpoints. An almost empty pool returns near nothing and is refused with that said plainly rather than quoted.

3. Approvals, only when selling

Buying takes one signature. USDC is Arc's gas currency, so a purchase pays it as the transaction's native value and there is nothing to approve first.

Selling EURC, cirBTC or WETH spends an ERC-20, which the router can only move with permission. That can take up to two approvals before the swap:

  1. ERC-20 to Permit2. One approval of the token for the Permit2 contract.
  2. Permit2 to the router. An allowance the Universal Router can spend, which expires in 30 days rather than living forever.

Each approval is its own signature, and the panel says how many are needed before you start. Existing allowances are read first, so an approval is only asked for when it is missing.

4. The rehearsal

Before the wallet is offered anything, the exact transaction is simulated from your own address at the head block through eth_simulateV1, with your real balance and no state overrides. The simulation brackets the swap with balance reads, so the answer carries what you would actually receive, what the fee would actually take, and the gas it used.

If the simulation does not come back clean, the button stays off and the reason is printed in plain language. A node that is merely rate limiting is retried rather than treated as a refusal.

If the simulator itself is unavailable, the transaction is checked with a gas estimate from your address instead, together with your USDC balance against the amount plus gas. That check says the transaction would not revert; it does not say what you would receive. The panel then reads Checked onchain rather than Simulated onchain, and prints which check ran.

5. One transaction, four actions

The swap is encoded by hand for the Universal Router as a single v4 command carrying four actions in order:

SWAP_EXACT_IN_SINGLE   swap your amount in the chosen pool
SETTLE_ALL             pay the pool exactly what you said you would spend
TAKE_PORTION           0.25% of the output to the Specie fee address
TAKE_ALL               the remainder to you, reverting below your minimum

A multi hop route uses SWAP_EXACT_IN with the path instead of the single pool action. The deadline is ten minutes from the moment the calldata is built. Because the fee is an action inside the same transaction, it cannot be skipped, doubled or promised for later.

When the best pool is a v3 pool, the same promise takes three router commands instead:

V3_SWAP_EXACT_IN   swap into the router itself, reverting below the gross minimum
PAY_PORTION        0.25% of what arrived to the Specie fee address
SWEEP              the remainder to you, reverting below your net minimum

6. Two minimums

Slippage produces two numbers. The gross minimum is what the pool must return before the fee is taken, and it guards the swap action. The net minimum is what must land in your wallet after the fee, and it guards TAKE_ALL. The panel shows the net one, because that is the number you actually receive.

Aero pools

Aero, the merged Aerodrome and Velodrome, runs concentrated-liquidity pools on Arc, and some of them are deeper than their Uniswap counterparts. WETH trades almost only there. Aero published no quoter on Arc, so Specie asks each pool directly what a swap would move, through a read-only call that reverts before anything settles.

An Aero route costs one extra signature, even when paying USDC: its router needs an ordinary allowance, which Specie sets to exactly the amount of the trade. So a buy only goes through Aero when it pays at least 0.05% more than the best Uniswap route. The fee is taken the same way as on v3, inside the same multicall:

exactInputSingle    swap into the Aero router, reverting below the gross minimum
sweepTokenWithFee   0.25% to the Specie fee address, the rest to you
Sales into USDC through Aero carry no Specie fee. The Aero router returns its native balance to the caller at the end of every swap, and on Arc that balance is USDC, so the proceeds reach your wallet before a fee could be taken. Specie still uses that route when Uniswap cannot fill the sale or pays more than 0.5% less, as it does for WETH, and the panel says there is no fee on it.

Where Specie refuses

CheckWhat happens
Uniswap not found at the configured addresses503, the panel says swaps are unavailable and the amount field is disabled
No pool with liquidity for the pairroutable: false with the reason
Fill more than 3% under the pool midsafe: false, no calldata is returned
Balance below the amountRefused with your actual balance named
Simulation revertsButton stays off, revert translated into a sentence
Pool moved past your slippageThe transaction reverts onchain instead of filling worse

On Arc the contracts are in place, so the first row only appears when a deployment points at a network without them. Every other row is a check each quote on Arc goes through.