Partial Fungibility
Token architecture where units within the same contract can have different properties, enabling distinct share classes with separate transfer rules.
Partial Fungibility is a token architecture pattern introduced by ERC-1410 that allows different units of the same token to have distinct properties, transfer rules, and legal statuses. Unlike standard ERC-20 tokens where every unit is identical and interchangeable, partially fungible tokens can represent multiple share classes—such as locked founder shares, vested employee options, and freely tradable secondary market shares—within a single smart contract.
This architectural shift is fundamental for security tokens because real-world securities are rarely homogeneous. A company's cap table typically includes shares with different vesting schedules, lock-up periods, dividend rights, and transfer restrictions. Partial fungibility moves these distinctions from external spreadsheets into the smart contract's storage layout, enabling programmatic enforcement of class-specific rules.
The Problem with Full Fungibility
Standard ERC-20 tokens use a simple balance mapping:
1mapping(address => uint256) private _balances;
This architecture assumes every token unit is identical—if you hold 100 tokens, any 100 tokens can satisfy a transfer. However, in capital markets, this assumption fails. Consider a founder who received shares subject to a 12-month SEC Rule 144 lock-up. Under ERC-20, representing locked and unlocked shares requires deploying two separate token contracts, which fragments liquidity, complicates governance, and creates cap table management nightmares.
ERC-1410 Architecture
ERC-1410 solves this by introducing token partitions:
1// ERC-1410: Partial Fungibility2mapping(address => mapping(bytes32 => uint256)) private _partitionBalances;3mapping(address => bytes32[]) private _partitionsOf;
Each bytes32 key represents a partition (e.g., keccak256("LOCKED"), keccak256("VESTED")). A single address can now hold tokens across multiple partitions, each with different properties. The auxiliary array tracks which partitions a user has interacted with, enabling enumeration despite Ethereum's non-iterable mappings.
Transfer Mechanics
Partial fungibility changes how transfers work:
1// Standard ERC-20 transfer2function transfer(address to, uint256 amount) public returns (bool);34// ERC-1410 partition-aware transfer5function transferByPartition(6 bytes32 partition,7 address to,8 uint256 amount,9 bytes calldata data10) public returns (bytes32);
The transferByPartition function allows specifying which partition to transfer from, and the data parameter enables off-chain injection of compliance certificates. The return value can indicate the destination partition (which may differ from the source if compliance rules require partition migration).
Use Cases for Partial Fungibility
Vesting Schedules: Employee stock options can be issued to a "UNVESTED" partition. As vesting milestones are reached, tokens migrate to a "VESTED" partition. Only vested tokens can be transferred or sold.
Lock-Up Enforcement: Regulation D shares (1-year lock-up) and Regulation S shares (40-day lock-up) can coexist in the same contract. Time-based logic automatically unlocks partitions when regulatory periods expire.
Dividend Rights: Different share classes may have different dividend rights. Class A shares in a "PREFERRED" partition might receive 2x dividends compared to Class B shares in a "COMMON" partition.
Geographic Restrictions: U.S. investors and international investors can be segregated into different partitions with jurisdiction-specific transfer rules and reporting requirements.
Gas Considerations
Partial fungibility introduces storage overhead that developers must consider:
Partition Tracking: The _partitionsOf array requires an SSTORE operation (20,000 gas for new slots) whenever a user interacts with a new partition. For protocols with many partitions or high user turnover, this compounds significantly.
Balance Lookups: Checking a user's total balance requires iterating through all their partitions—O(n) complexity versus O(1) for ERC-20. Implementations should cache total balances or limit partition counts per user.
Transfer Complexity: Each transferByPartition involves more storage reads/writes than a standard transfer. The gas cost is the "compliance tax" for on-chain regulatory enforcement.
Security Considerations
Partition Bypass: A critical vulnerability occurs when compliance logic is applied to transferByPartition but not to inherited ERC-20 transfer functions. Attackers can bypass partition restrictions by using the standard transfer path. Mitigation: all transfer entry points must route through a single _verifyTransfer hook.
Partition Manipulation: If partition keys are user-controllable or predictable, attackers might create partitions that bypass compliance checks. Mitigation: restrict partition creation to authorized roles, validate partition names against allowlists.
Cross-Partition Arbitrage: If different partitions have different valuations or rights, users might exploit migration logic to move tokens to more favorable partitions. Mitigation: implement strict partition migration rules with appropriate access controls.
Enumeration Attacks: The _partitionsOf array is publicly readable. In privacy-sensitive contexts, this reveals which share classes a user holds. Consider privacy implications when designing partition structures.
Comparison with Alternative Approaches
| Approach | Pros | Cons |
|---|---|---|
| Multiple ERC-20 Contracts | Simple, standard tooling | Fragmented liquidity, complex cap table |
| ERC-1155 Multi-Token | Native multi-class support | Not designed for securities compliance |
| ERC-1410 Partial Fungibility | Single contract, compliance-native | Higher gas costs, implementation complexity |
| ERC-3643 Identity-Based | Modular compliance | No native partition support |
Implementation Best Practices
-
Limit Partition Count: Cap the number of partitions per user to prevent gas griefing attacks on enumeration functions.
-
Default Partition: Define a default partition for standard ERC-20 compatibility. Tokens transferred via
transfer()should use this default. -
Partition Metadata: Store partition-level metadata (lock expiry, dividend multiplier) in a separate mapping for gas-efficient lookups.
-
Migration Events: Emit detailed events when tokens move between partitions for off-chain indexing and compliance reporting.
-
Backwards Compatibility: Implement ERC-20 interface functions that aggregate across all partitions for wallet compatibility.
Understanding partial fungibility is essential for developers building tokenized securities. It represents the foundational architectural decision that enables on-chain representation of complex capital structures while maintaining the programmability and auditability that blockchain provides. The trade-off between gas efficiency and compliance granularity must be carefully evaluated based on the specific use case and expected transaction volumes.
Articles Using This Term
Learn more about Partial Fungibility in these articles:
Related Terms
Token Partition
Named tranche (bytes32 key) within ERC-1410 tokens separating shares by legal status such as locked, vested, or freely tradable.
Security Token
Blockchain-based representation of regulated securities (equity, debt, real estate) requiring transfer restrictions and investor verification under securities law.
Modular Compliance
Pluggable smart contract architecture allowing regulatory rules (country bans, holder limits) to be updated without redeploying the token contract.
Need expert guidance on Partial Fungibility?
Our team at Zealynx has deep expertise in blockchain security and DeFi protocols. Whether you need an audit or consultation, we're here to help.
Get a Quote

