What the pipeline costs
Three and a half thousand gas over a plain transfer, and none of it is discovery. Reading a token's declarations costs its transfer path nothing, and there is a test that pins it to the byte.

Adjectives are how projects usually describe their own overhead, so the suite prints a table instead. Every figure is a warm transfer between two funded accounts, measured as a gas delta around the call. Cold-slot costs are deliberately excluded: they are paid once per pair of accounts and would drown the differences the table exists to show.
- 3,906
- A plain ERC-20 transfer. The baseline everything else is measured against.
- 7,464
- The same transfer on an extended token with nothing switched on. The pipeline itself costs 3,558.
- 12,671
- With the fee active. The fee leg is a second balance movement and a second event, and both are real.
- 9,895
- With a hook installed. An external call, a gas budget, and a check on what came back.
What the baseline buys
The 3,558 is phase dispatch plus the registry reads that make the ordering guarantee possible. It is not free and nobody claims it is. What it is, is constant. It does not depend on the amount, on the accounts, or on how many modules are installed, and it is the same on the millionth transfer as on the first.
On a rollup, where the cost that matters is calldata rather than execution, that number is close to noise. On mainnet it is real money, and it is the price of a token that can be integrated without a manual audit per protocol.
Discovery is not in the table
The other half of the story is the half with no numbers. Listing extensions, reading the behaviour word, fetching a module's configuration, checking an account's state — none of it sits on the transfer path, so none of it appears in a transfer's gas at all.
There is a test that reads every discovery surface the token has and then measures the same transfer again, asserting the figure is identical to the byte. It exists because this is exactly the kind of claim that decays quietly: somebody adds a convenience check to the transfer path, the number moves by a hundred, and nobody notices for a year.
What costs is the behaviour itself, and that is the part an integrator was always going to pay for.