TRADE-OFFS
What I hid, what I kept, and what I refused to hide
Fee abstraction is easy to take too far. Every removed number makes the screen calmer and the product slightly less honest, and the line between simplifying a cost and obscuring one is not obvious in a mockup. What follows is where I drew it.
WHAT I CHOSE | WHAT I CUT | WHY |
|---|---|---|
The fee in dollars | Gwei, gas limits, priority tiers | Gwei prices the chain's work, not the user's transaction. The detail sits behind the chevron on the fee row for anyone who wants it, deferred, not deleted. |
Fee paid from the token being sent | Requiring the chain's native token | A fee in a currency you must go and buy is a prerequisite, not a fee. The cost is that coverage varies by chain, which forced a fallback that does not read as failure. |
A top-up for the exact shortfall | The insufficient-balance error | An error that names a problem at the last step of a flow without solving it is a dead end wearing the costume of feedback. |
MY CONTRIBUTION
What I owned on walllet's fee model
This was a pattern rather than a screen. Any feature that puts a transaction on-chain uses the same fee row, the same wording and the same fallback, so the cost of a transaction reads identically wherever a user meets one.
WHAT I OWNED
The fee row and its hierarchy, what the fee is, what it is paid with, what it costs in dollars, and the route to the underlying detail. The decision to include the fee in the amount rather than add it after. The behaviour of Max. The exact-shortfall top-up and its copy. The adjustment disclosure. And the rule that this row is the same object in every transactional flow rather than a per-feature design.
A fee you have to buy a different currency to pay is not a fee. It is a prerequisite.
DESIGN DETAIL
Four states of one fee row
The default: what it costs and what pays for it
One line answers the question, a second says which token it comes out of, and the chevron leads to the detail. "Included" is the load-bearing word the fee comes out of the amount rather than being added on top, so the number entered is the number that leaves the account.
Entering an amount you know will clear
Amount and fee are calculated together, so Max fills in a figure that already accounts for the cost of sending it. The keypad is denominated in dollars with the token amount underneath, which is the same order of priority as the fee row, value first, crypto second.
When the amount has to move
If the entered amount cannot cover itself plus the fee, the checkout adjusts it and says so on its own line. The alternative — rejecting the transaction and asking the user to work out a smaller number — puts arithmetic in front of someone who has already decided to send.
When the fee cannot be abstracted
Coverage is not universal across chains. Where it is unavailable the row turns into the smallest possible solution: the exact shortfall, offered inline, with the send button waiting rather than the flow ending. The failure state is a step, not a wall.
