# Three prices, one trade: the label, the quote and the fill

> Canonical: https://blazephoenix.xyz/learn/three-prices
> License: CC BY 4.0 (attribution + link) · © 2026 BlazePhoenix
> Updated: 2026-08-13

The label price, the quote and the fill are three different numbers, worked through one pool of 1,000/1,000 with a 0.3% fee: trading 100 A yields a net quote of 90.4072 B — 9.0909 lost to price impact (94.8% of the whole cost), 0.2480 to the pool fee, 0.2539 to the 28 bps protocol fee — and of the three prices only the minimum output was ever a promise.

A screen shows you that one A is worth one B, you trade 100 A, and 90.41 B arrives. Nobody lied to you. Three different prices were involved and only one of them was ever a promise. This article names all three and accounts for every unit of the difference, using arithmetic you can redo on paper.

The whole article runs on one example pool, so fix it now. The pool holds 1,000 of token A and 1,000 of token B, and it charges 0.3% on what you pay in — a common setting, not a number of ours. You are trading 100 A.

## Price one: the label

The pool sets its price from what it holds. With 1,000 of each token, the ratio is 1,000 / 1,000 = 1, so one A is priced at one B. That ratio is the label price, sometimes called the mid or spot price.

It is a true number and it is nearly useless on its own, because it is the price of an infinitely small trade. It tells you what the pool would charge for the very next atom, not for your 100 tokens. Reading the label and expecting to receive 100 B is the single most common beginner mistake, and it is not a scam — it is a misreading of what the label measures.

## Price two: the quote

The pool follows one rule: the two amounts it holds, multiplied together, must not get smaller. It starts at 1,000 x 1,000 = 1,000,000. If you pour A in, the A side grows, so the B side must shrink to keep that product — and what you receive is exactly what the B side gives up.

Run it with no fee first, so the two effects stay separate. You put in 100, the A side becomes 1,100, so the B side must fall to 1,000,000 / 1,100 = 909.0909. You receive what it gave up:

```
1000 - (1000000 / 1100) = 1000 - 909.0909 = 90.9091 B
```

So before any fee at all, 100 A returns 90.9091 B, not 100. You lost 9.0909 tokens to the shape of the rule itself. That is not a charge and nobody collected it: you moved the pool's own ratio as you traded, and every token after the first paid the worse price you had just created. The name for it is price impact.

Now switch the fee on. The pool credits only 99.7% of your input to the trade, so instead of 100 the trade uses 99.7:

```
(1000 x 0.997 x 100) / (1000 + 0.997 x 100)
  = 99700 / 1099.7
  = 90.6611 B
```

The fee therefore cost 90.9091 - 90.6611 = 0.2480 B. Notice how small it is next to the 9.0909 from impact — a fortieth of the total damage — and notice that the fee did not shrink. It is 0.3% of whatever you put in, at every size. What changed is the thing beside it.

Last, the protocol fee: 28 basis points of the output. A basis point is one part in 10,000, so 28 bps is 28 / 10,000 = 0.0028, or 0.28%.

```
protocol fee = 90.6611 x 0.0028 = 0.2539 B
net quote    = 90.6611 - 0.2539 = 90.4072 B
```

That 90.4072 is the quote: the number the contract computed for your exact size, against the pool balances at a specific block. It is not the label, and it is not yet what you will receive.

## The whole cost, accounted for

You paid 100 and the quote says 90.4072, a total cost of 9.5928 tokens, or 9.59% against the label. Every unit of it now has a name:

```
price impact  100      - 90.9091 = 9.0909   (94.8% of the cost)
pool fee      90.9091  - 90.6611 = 0.2480   ( 2.6% of the cost)
protocol fee  90.6611  - 90.4072 = 0.2539   ( 2.6% of the cost)
                                  -------
total                             9.5928
```

Add the three: 9.0909 + 0.2480 + 0.2539 = 9.5928, which closes exactly against 100 - 90.4072. Nothing is unexplained.

And read the shares before you conclude anything about fees. On this trade, 94.8% of what you gave up came from the size of your order against the depth of the pool, and 5.2% came from both fees combined. Choosing a venue by the fee on its label, while ignoring how deep it is, optimises the small number and ignores the large one.

## Price three: the fill

The quote was computed against the pool as it stood at some block. Your transaction executes at a later block. In between, other people trade against the same pool, and the balances that produced 90.4072 are no longer the balances your trade meets.

This can move either way. If someone sold B into the pool before you, the B side is deeper and you receive more than the quote. If someone bought B, you receive less. The fill is the amount that actually lands in your wallet, and it is the only one of the three prices you ever really had.

There is a deliberate version of this, too. Because pending transactions are public, a bot can place its own trade immediately before yours to move the price against you, and another immediately after to take the difference. No contract can prevent that, because the ordering is decided outside the contract, before it runs. Saying otherwise would be the marketing claim this site does not make.

## The only number that is a promise

Since the quote is a calculation and the fill is an outcome, the binding number is neither. It is the minimum output: the amount below which the transaction reverts and you keep your input.

That minimum comes from two places. You set a tolerance, which fixes your own floor as a percentage of the quote. Independently, the protocol enforces its own: every leg must return at least 80% of what the chain itself quoted for that leg, measured before the protocol fee, and the aggregate floor is clamped so it can never sit below 80%. The second is a catastrophe stop, not a good deal — it exists so that a broken or hostile pool cannot return you a tenth of your money, and nothing more than that.

So the honest summary of the three prices: the label tells you the pool's ratio, the quote tells you what your size would have returned a moment ago, and the floor tells you the worst you will accept. Only the last one is enforced.

**Verify it yourself:** Redo the three lines of arithmetic above with your own numbers: put your pool's two balances in place of 1000 and 1000, your size in place of 100, and read the protocol fee straight from the chain with cast call <QUOTER> "PROTOCOL_FEE_BPS()(uint256)" — it must return 28.

Related: https://blazephoenix.xyz/learn/sizing-your-trade · https://blazephoenix.xyz/learn/minimum-output-explained · https://blazephoenix.xyz/learn/price-impact-explained · https://blazephoenix.xyz/learn/how-to-read-a-quote · https://blazephoenix.xyz/learn/why-aggregator-quotes-differ
