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 v4 pools that exist, drops the ones with no liquidity, asks the Quoter what your exact amount returns, and keeps the best answer. 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 EURC or USYC, 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".
3. Approvals, and why a buy needs them too
On most chains a buy spends the native coin and needs no approval. On Arc the quote asset is USDC as an ERC-20, so both directions spend a token and both may need up to two approvals:
- ERC-20 to Permit2. One approval of the token for the Permit2 contract.
- 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.
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 minimumA 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.
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.
Where Specie refuses
| Check | What happens |
|---|---|
| Uniswap not found at the configured addresses | 503, the panel says swaps are not open and the amount field is disabled |
| No pool with liquidity for the pair | routable: false with the reason |
| Fill more than 3% under the pool mid | safe: false, no calldata is returned |
| Balance below the amount | Refused with your actual balance named |
| Simulation reverts | Button stays off, revert translated into a sentence |
| Pool moved past your slippage | The transaction reverts onchain instead of filling worse |
Routing on Arc Testnet is not open yet, so the first row is the state you will meet today. Everything above it is what runs the moment the contracts are there.