comparison · spec-grade diff

ERC-20 vs LSP·7 Ethereum/EVM standard comparison

ERC-20 made fungible tokens composable on EVM. LSP7 keeps the model, then adds receiver hooks, transfer context, scoped operators, and ERC-725Y-backed metadata.

Spec diff.

ERC-20 LSP·7
balance model balanceOf(address) → uint256 balanceOf(address) → uint256
transfer signature transfer(to, amount) transfer(from, to, amount, force, data)
recipient notification none LSP1 universalReceiver on both sides
transfer data payload none — workaround via wrappers bytes calldata data — native
authorization approve / allowance / transferFrom authorizeOperator + LSP6 controller scope
metadata name / symbol / decimals only ERC-725Y under LSP4 keys
metadata shape off-chain by convention typed JSON via LSP4, VerifiableURI optional
interface compatibility ERC-20 selectors — code that ABI-checks for ERC-20 dispatches different selectors — won't accidentally satisfy ERC-20 ABI checks
reentrancy surface on transfer none — no recipient call LSP1 hook fires on recipient; standard reentrancy guards required

How they differ structurally

ERC-20 is a balance sheet plus a transfer event. The minimum interface that made composability possible. The integration tax — receiver hooks, transfer context, approval risk — falls on everyone who builds on top.

LSP7 keeps the balance sheet and adds the surrounding system. Every transfer has a force flag and a bytes data payload. Every transfer fires universalReceiver on sender and recipient through LSP1. Every authorization event includes an operatorNotificationData payload so receivers can react when operators are set or revoked. Metadata lives in ERC-725Y under LSP4-defined keys, not in three top-level functions.

When to migrate

Migrate when the token needs receiver awareness (vaults that credit on deposit), structured metadata (governance tokens with proposal links), or account-level permission scoping (apps that should have narrow authority, not blanket allowance).

Don’t migrate when ERC-20 compatibility is the product. A wrapped reserve asset doesn’t gain from LSP7’s hooks.

Operator scope is honest

LSP7 authorizeOperator is still amount-scoped. It is not magical. The structural shift comes from pairing it with a Universal Profile: now the controller calling authorizeOperator is itself constrained by LSP6 permissions, allowed calls, and allowed selectors. The token contract doesn’t have to police future drains — the account does, at a higher altitude.

Read the source.