Standard ERC-1155 on Ethereum is a proven choice for multi-asset tokens. But gas fees during peak hours reach tens of dollars per transaction, and gas limits restrict logic complexity. For projects where every cent counts, Tezos with its FA2 (TZIP-12) standard becomes a pragmatic alternative. One contract manages both fungible and non-fungible tokens, and the Michelson architecture minimizes gas costs. Gas savings reach 95% compared to Ethereum. We have developed dozens of FA2 contracts for DeFi protocols and NFT collections—here we share proven approaches.
FA2 (TZIP-12) is a standard that unifies fungible tokens and NFTs in one contract. Unlike ERC-1155, it uses granular operator management and built-in on-chain views. This simplifies integration with Tezos exchanges and marketplaces.
Why FA2 is more cost-effective than ERC-1155?
Instead of deploying one contract for ERC-20 and another for ERC-721, FA2 requires one contract with arbitrary token_id. This architectural decision saves gas during distribution and simplifies management. Here is a comparison with ERC-1155:
| Parameter | FA2 (Tezos) | ERC-1155 (Ethereum) |
|---|---|---|
| Language | SmartPy / LIGO | Solidity |
| Gas per mint | ~0.001 XTZ (at $1 price) | $5-50 |
| Metadata | TZIP-16 (on-chain/IPFS) | URI + base extension |
| Operators | Granular (per token_id) | SetApprovalForAll |
| On-chain view | Explicit (onchain_view) |
Via callStatic |
| Gas limits | Virtually none | Strict block limits |
FA2 outperforms ERC-1155 by a factor of 10 in gas costs for a typical transfer operation. At an XTZ price of around $1, an FA2 transaction costs cents, whereas on Ethereum it costs from $5 to $50. This makes Tezos attractive for high-frequency transfers and micropayments.
How to implement multi-asset in one contract?
One contract for three token types: governance (fungible), utility (fungible), and an NFT collection (non-fungible). The key is token_id in the ledger. Use big_map for large collections to avoid paying gas for storing the entire table in memory.
In one project, we combined a governance token (token_id=0), a utility token for staking (token_id=1), and an NFT collection of 10,000 avatars (token_id=1000-10999). All in one contract. This reduced gas by 3x compared to ERC-1155 and simplified the exchange logic between tokens.
import smartpy as sp @sp.module def main(): class FA2Token( FA2_ERRORS.Fungible, FA2_ERRORS.Admin, FA2_ERRORS.MintFungible, FA2_ERRORS.BurnFungible, sp.Contract ): def __init__(self, admin, metadata, token_metadata): FA2_ERRORS.Admin.__init__(self, admin) FA2_ERRORS.Fungible.__init__(self, { "ledger": sp.big_map(tkey=sp.TRecord(owner=sp.TAddress, token_id=sp.TNat), tvalue=sp.TNat), "operators": sp.big_map(tkey=sp.TRecord(owner=sp.TAddress, operator=sp.TAddress, token_id=sp.TNat), tvalue=sp.TUnit), }) self.init_metadata("metadata", metadata) self.data.token_metadata = sp.big_map({0: sp.record(token_id=0, token_info=token_metadata)}) self.data.supply = sp.big_map({0: 0}) @sp.entrypoint def mint(self, to_, token_id, amount): sp.verify(sp.sender == self.data.admin, "NOT_ADMIN") key = sp.record(owner=to_, token_id=token_id) current = self.data.ledger.get(key, default=0) self.data.ledger[key] = current + amount self.data.supply[token_id] = self.data.supply.get(token_id, default=0) + amount The standard transfer entrypoint includes built-in operator checks (see SmartPy documentation).
What does turnkey FA2 development include?
Our engineers with 10+ years of blockchain experience provide a full package:
- Smart contract code in SmartPy with unit tests (>=95% coverage).
- TZIP-16 and TZIP-21 metadata (IPFS if needed).
- Gas optimization: using
big_mapfor ledger, minimizing storage reads. - Integration with wallets (Temple, Kukai) via Taquito.
- Deployment guide (Ghostnet for testing, Mainnet for production).
- 2 weeks of post-launch support.
Contact us for an estimate: fill out the form on the website—we'll respond within a day.
Comparison of FA2 with the previous FA1.2 standard
| Feature | FA1.2 | FA2 |
|---|---|---|
| Token types | Fungible only | Any (fungible, NFT, mixed) |
| Metadata | TZIP-10 | TZIP-16/21 |
| Operators | SetApprovalForAll | Granular per token_id |
| Flexibility | Limited | High |
| Popularity | Deprecating | Current standard |
FA2 is an evolution that solves the limitations of FA1.2.
Importance of auditing FA2 contracts
Even simple FA2 contracts can contain errors: reentrancy, incorrect operator handling, faulty allowances. Auditing an FA2 contract includes checking for these vulnerabilities, formal verification (SmartPy tests), and stress tests on Ghostnet. We guarantee passing audits on critical errors—this reduces the risk of fund loss and reputational damage.
Workflow
- Discovery (2-3 days)—token specification, metadata, operators.
- Development (1-3 weeks)—coding in SmartPy, unit tests (>=95% coverage).
- Integration (1-2 weeks)—connecting via Taquito to Temple/Kukai.
- Audit—check for reentrancy, gas exhaustion, formal verification.
- Deployment—testing on Ghostnet, then Mainnet with verification on TzKT.
Estimated timelines: basic contract from 1 week, with customization up to 6 weeks. Get a consultation: describe your requirements in the form on the website—we'll calculate timelines and cost individually.
Our advantages
We have developed 30+ smart contracts on Tezos, including DeFi protocols, NFT marketplaces, and gamified projects. We guarantee: passing formal verification, no critical errors (Slither/Tezos), and full documentation. All work is done under a contract with a fixed budget.
Evaluate your project: describe your requirements in the form on the website—get timelines and budget within 1 day.







