ERC-1155 is the Multi Token Standard: a single smart contract can manage any number of token types, each identified by an ID, with any supply — one for a unique item, millions for a fungible unit. Transfers can move many token types in one transaction, and a shared metadata URI keeps thousands of assets cheap to describe. That efficiency is why we chose ERC-1155 for a real estate tokenization platform (one token class per property) and an electricity tokenization platform (one token per watt-hour).
Key takeaways
- One ERC-1155 contract can represent a whole portfolio — each property, vintage, loan pool or product line gets its own ID.
- Batch transfers and batch balance queries reduce gas and simplify portfolio operations.
- Receiver hooks prevent tokens from being lost in non-aware contracts, but introduce re-entrancy surface that must be handled.
- ERC-1155 has no built-in compliance. For securities, enforce identity and transfer rules in the contract or adopt ERC-7943; compare with ERC-3643.
How ERC-1155 works
| Function / event | Purpose |
|---|---|
balanceOf(account, id) |
Balance of one token type |
balanceOfBatch(accounts[], ids[]) |
Many balances in one call |
safeTransferFrom(from, to, id, amount, data) |
Move one token type |
safeBatchTransferFrom(from, to, ids[], amounts[], data) |
Move several token types at once |
setApprovalForAll(operator, approved) |
Operator approval for all IDs |
TransferSingle / TransferBatch |
Events covering mint, burn and transfer |
URI(value, id) |
Metadata URI updates |
Recipients that are contracts must implement onERC1155Received / onERC1155BatchReceived, otherwise the transfer reverts. Metadata uses uri(id), where clients replace {id} with the hex token ID — e.g. ipfs://…/{id}.json.
There is no per-ID allowance; approvals are all-or-nothing per operator. For financial assets, that means operator approvals must be handled carefully in custody and marketplace contracts.
Why ERC-1155 suits many RWA programmes
Property portfolios
Each building becomes token ID n with its own supply, valuation and income stream, while investors, KYC status and the marketplace are shared. Our real estate platform used exactly this, with IPFS-anchored property documents, a private secondary market among eligible investors and automatic rental distributions.
Energy and environmental units
High-frequency units need cheap minting and burning. In our electricity project, ENERGY tokens are minted per signed meter reading to the generator, CONSUMPTION tokens are minted at each consumption point, and both are burned 1:1 at settlement. Carbon credits by vintage or methodology map cleanly to IDs too — see carbon credit tokenization.
Mixed fungible and non-fungible assets
A single contract can hold a unique title NFT (supply 1) alongside fractional shares (supply 10,000) and reward points (fungible). That makes ERC-1155 a natural fit for structured products and loyalty-linked programmes.
Loan pools and tranches
Each pool or tranche can be an ID, making portfolio-level reporting and batch distributions straightforward.
Adding compliance to ERC-1155
To use ERC-1155 for securities, we typically:
- Override the internal update hook to call a compliance check (identity verified, jurisdiction allowed, holding limits) before any balance changes — covering mint, transfer and batch transfer.
- Expose eligibility views such as
canTransfer(from, to, id, amount)— ideally via the ERC-7943 multi-token interface — so wallets and venues can pre-check. - Add agent functions for freezing (per account and ID), forced transfer and recovery.
- Keep KYC pluggable so a regulated provider can be swapped without redeploying tokens — a design we used on the real estate platform.
- Record governance actions on-chain and keep contracts publicly verifiable.
Security notes
- Re-entrancy: receiver hooks call external code. Follow checks-effects-interactions and use re-entrancy guards around distribution and marketplace logic.
- Batch arrays: validate equal array lengths and bound loop sizes to avoid out-of-gas denial of service.
- Operator approvals: an approved marketplace can move every ID a user holds — scope approvals in your UX and contracts.
- Supply tracking: use a supply extension so total supply per ID is queryable for reconciliation.
ERC-1155 vs alternatives
| Need | ERC-1155 | Alternative |
|---|---|---|
| Many asset classes in one contract | ✔ | ERC-6909 (simpler, no callbacks) |
| Strict regulated securities | Needs extension | ERC-3643 |
| Single unique asset per contract | Possible | ERC-721 |
| Value-bearing slots (bonds, vesting) | Possible | ERC-3525 |
See ERC-6909 for a leaner multi-token design and ERC-3525 for semi-fungible financial instruments.
Example: a compliance-aware ERC-1155 for a property portfolio
The sketch below illustrates how we enforce eligibility for every mint, transfer and batch transfer by overriding the single internal update function in a modern ERC-1155 implementation.
// Illustrative only — not audited.
contract PropertyShares is ERC1155, AccessControl {
bytes32 public constant ISSUER_ROLE = keccak256("ISSUER_ROLE");
IEligibility public eligibility; // pluggable KYC/AML results
mapping(uint256 => bool) public listed; // one ID per property
function issue(address to, uint256 propertyId, uint256 amount) external onlyRole(ISSUER_ROLE) {
require(listed[propertyId], "unknown property");
_mint(to, propertyId, amount, "");
}
function _update(address from, address to, uint256[] memory ids, uint256[] memory values)
internal override
{
for (uint256 i; i < ids.length; ++i) {
if (to != address(0)) require(eligibility.canReceive(to, ids[i]), "receiver not eligible");
if (from != address(0) && to != address(0)) require(eligibility.canSend(from, ids[i]), "sender restricted");
}
super._update(from, to, ids, values);
}
}
Because eligibility is checked per token ID, different properties can carry different rules — for example one building open to professional investors in the EU, another restricted to a single country.
Token ID strategies
How you allocate IDs determines how easy the platform is to operate:
| Strategy | Example | When to use |
|---|---|---|
| Sequential | 1, 2, 3 … per property | Simple portfolios |
| Encoded | Upper bits = asset class, lower bits = asset number | Mixed asset types in one contract |
| Hash-based | keccak256(assetRef) |
Deterministic IDs from external references |
| Vintage/series | Project × year | Carbon credits, energy certificates |
Document the scheme; investors, auditors and indexers will rely on it.
Distributions across many IDs
ERC-1155 makes portfolio distributions efficient. A typical monthly run for a property portfolio:
- Snapshot balances per ID at the record date (via events or a snapshot extension).
- For each property, compute net distributable income after fees and reserves.
- Record per-holder entitlements per ID.
- Holders claim in one transaction across all their properties.
This is exactly where ERC-1155 outperforms deploying one ERC-20 per asset: one claim, many assets.
Metadata for financial assets
Use the uri(id) template to serve a JSON document per ID with valuation date, location (at an appropriate granularity), legal entity, document hashes and income history. Keep private data out; publish hashes of the data room documents instead — see ERC-1643 document management.
Frequently asked questions
Yes, especially for portfolios: each property is an ID with its own supply and income, while compliance and the marketplace are shared. Add identity-gated transfer logic for securities.
Yes. Any ID can have a supply greater than one, so fractions of an asset are simply units of that ID.
Batch minting, batch transfers and batch balance queries reduce the number of transactions and storage writes compared with deploying many ERC-20 or ERC-721 contracts.
Yes — Hedera’s EVM-compatible smart contract service runs ERC-1155 contracts. Both our real estate and electricity platforms used ERC-1155 on Hedera.
Practically unlimited — IDs are 256-bit numbers. Operational limits come from your metadata, indexing and governance, not the contract.
Yes, if your compliance logic checks rules per ID, as in the example above.
Support is growing but less universal than for ERC-20. Confirm with your chosen custodian early.
This article is for general information only and is not legal, tax or investment advice. Token standards evolve — always confirm the current status of an ERC at eips.ethereum.org and take advice from qualified counsel in each jurisdiction before issuing tokens.


