problem · erc1155 complexity

ERC-1155 complexity

ERC-1155 hides semantics in token IDs.

ERC-1155 LSP·7 LSP·8

One contract for fungible + identifiable items. Apps pay the decoding tax.

ERC-1155 balanceOf(account, id)
one contract many semantics app-decoded
LSP·7+8 split by asset shape
LSP7 fungible LSP8 identifiable
LUKSO route

If you're dealing with ERC-1155 complexity, the LUKSO route is LSP7 + LSP8. LSP7 covers fungible and semi-fungible. LSP8 covers identifiable. The semantic split lives in the interface itself, so downstream code dispatches on asset shape without learning per-collection bit-conventions. Receivers handle both through one LSP1 hook with a typeId discriminator.

Why this breaks

One ERC-1155 contract can hold currency-like tokens, edition NFTs, and unique items at once. Wallets and indexers have to decode the intent of each id from per-collection rules. Marketplaces add custom logic per contract because there is no standard way to know which ids are fungible vs unique.

Batch transfer is genuinely useful, but it composes badly with receiver hooks — every receiver must implement IERC1155Receiver, including for batches. The savings on gas land as costs on integrators.

What people try

High-bit token ID conventions

Encode “this id range is fungible, this is unique” into the top bits. Works inside one contract. Any external code that wants the same semantics has to learn the convention.

One-contract-per-game patterns

Restore the boundary ERC-1155 erased. Negates the gas savings that motivated ERC-1155 in the first place.

Off-chain id registries

Move the typing problem to an off-chain index. The on-chain state still has no opinion.

Custom decoder logic per contract

Every consumer has to implement the per-id type rules. The cost compounds for each new integration.

How LSP solves it

LSP7 covers fungible and semi-fungible assets. LSP8 covers identifiable assets. They share transfer naming (the same force flag and bytes data parameter), the same LSP1 receiver hook, and the same LSP4 metadata pattern.

When you need multi-asset packing, you ship multiple LSP7/LSP8 contracts. The semantic boundary is in the standard, not encoded in token-id bit ranges that every integrator has to learn separately.

continue at the source