{"id":"ERC-3525","name":"Semi-Fungible Token","status":"Final","chain":"both","category":{"id":"defi","name":"DeFi Patterns","description":"Vaults, bonds, and financial primitives"},"journeyStages":[{"id":"asset-display","name":"Asset Discovery & Display","description":"Seeing tokens, NFTs, and balances"}],"uxImpact":"Users hold tokens with both NFT-like uniqueness (ID) and fungible-like quantities (value) within slots — think financial instruments with face values. Design implications: display three properties: token ID, slot category, and value amount, enable partial value transfers between tokens of same slot, show value decimals properly, implement slot-based filtering/grouping in portfolio views. Design decisions: whether to visualize as NFT cards with value badges or as table rows, how to handle split/merge operations UX, representing slot compatibility for transfers.","hasDetailedContent":true,"content":{"id":"ERC-3525","summary":"ERC-3525 creates \"semi-fungible tokens\" - NFTs that have both an ID (uniqueness) and a value (quantity). Perfect for bonds, invoices, DeFi positions, and structured products where you need unique tokens that also represent amounts.","applicability":{"whenToUse":["Your product addresses: nFTs can't represent partial amounts.","Your product addresses: eRC-1155 can't track per-token attributes.","The flow should deliver: sFT has ID + value. Token #123 can hold 50 units, split into two 25-unit tokens.","You are designing a bond portfolio display experience with visible states and recovery paths."],"whenToAvoid":["Always show token ID AND value prominently.","Only show compatible (same-slot) tokens for value transfer.","Show original token continues to exist with reduced value.","No token balances, swaps, lending, or yield flows appear in the product."]},"designerTakeaways":["You can design UI that delivers sFT has ID + value. Token #123 can hold 50 units.","You can each SFT ID is unique but shares \"slot\" (category) with similar tokens in the interface.","You can design UI that delivers one SFT represents unique position with value in single token."],"problemsSolved":[{"problem":"NFTs can't represent partial amounts","oldWay":"Own 100% of an NFT or nothing. Can't own \"50 units of Bond #123\"","newWay":"SFT has ID + value. Token #123 can hold 50 units, split into two 25-unit tokens","impact":"critical"},{"problem":"ERC-1155 can't track per-token attributes","oldWay":"All token ID 5 are identical. Can't have Bond #5 with different maturity dates","newWay":"Each SFT ID is unique but shares \"slot\" (category) with similar tokens","impact":"high"},{"problem":"Complex DeFi positions need multiple tokens","oldWay":"Represent bond position with ERC-721 for ID + ERC-20 for value","newWay":"One SFT represents unique position with value in single token","impact":"high"},{"problem":"Can't merge or split positions easily","oldWay":"Burning and reminting required to combine positions","newWay":"Native transfer value between same-slot tokens, or split/merge","impact":"medium"},{"problem":"Invoice/receivable tokenization is awkward","oldWay":"Invoice as NFT can't be partially assigned or valued","newWay":"Invoice token with face value, can be split or partially transferred","impact":"medium"}],"uxPatterns":[{"name":"Bond Portfolio Display","description":"Show bonds with their values and categories","mockup":"generic/vault-deposit","userFlow":["User views bond portfolio","Bonds grouped by slot (category)","Each bond shows unique ID + value","User can split, transfer value, or redeem"]},{"name":"Split Token Flow","description":"Divide one token into two with split values","mockup":"concept/tx-status","userFlow":["User selects bond to split","Enters amount for new token","UI shows resulting two tokens","User confirms split","Two bonds now exist with split values"]},{"name":"Value Transfer Between Tokens","description":"Move value from one token to another in same slot","mockup":"generic/token-transfer","userFlow":["User has multiple tokens in same slot","Selects source and destination","Enters value amount to transfer","Preview shows result","Value moves, token IDs preserved"]},{"name":"DeFi Position Card","description":"Display complex DeFi position as SFT","mockup":"generic/vault-position","userFlow":["User views LP position (SFT)","Sees unique position ID + value (liquidity)","Range and current price shown","Can add/remove partial liquidity","Transfer value to split position"]}],"uiComponents":[{"name":"SFTCard","description":"Display semi-fungible token with ID and value","states":["normal","selected","splitting","transferring"],"props":["tokenId","slot","value","metadata","onAction"]},{"name":"SlotGroup","description":"Group tokens by their slot (category)","states":["collapsed","expanded"],"props":["slot","tokens[]","totalValue"]},{"name":"SplitInterface","description":"UI for splitting token into two","states":["editing","previewing","confirming","complete"],"props":["sourceToken","splitAmount","onSplit"]},{"name":"ValueTransferFlow","description":"Move value between same-slot tokens","states":["selecting","amount-entry","confirming","complete"],"props":["fromToken","toToken","amount","onTransfer"]},{"name":"MergeSelector","description":"Select tokens to merge into one","states":["selecting","ready","merging","complete"],"props":["eligibleTokens[]","selectedTokens[]","onMerge"]}],"antiPatterns":[{"pattern":"Displaying SFTs like regular NFTs (no value shown)","why":"The value IS the key differentiator, hiding it loses the point","instead":"Always show token ID AND value prominently","severity":"critical"},{"pattern":"Allowing transfers between different slots","why":"Slots represent different categories, can't mix bond types","instead":"Only show compatible (same-slot) tokens for value transfer","severity":"high"},{"pattern":"Confusing split with burn-and-mint","why":"Split preserves the original token (with less value)","instead":"Show original token continues to exist with reduced value","severity":"medium"},{"pattern":"Not grouping by slot","why":"Users can't see which tokens are compatible for operations","instead":"Group tokens by slot in portfolio view","severity":"medium"},{"pattern":"Complex slot IDs shown to users","why":"Slot is often a technical hash, meaningless to users","instead":"Map slots to human-readable categories: \"Corporate Bonds\"","severity":"medium"},{"pattern":"Not explaining what slot means","why":"Users don't understand why some tokens can interact and others can't","instead":"Explain: \"Tokens in same category can share value\"","severity":"low"}],"onMonad":[{"aspect":"Split/Merge Gas","ethereum":"Complex operations can be expensive","monad":"Lower gas makes frequent splits/merges viable","designImplication":"Can offer more granular position management"},{"aspect":"Value Transfer Speed","ethereum":"Value transfers are single-block atomic","monad":"Sub-second finality makes transfers feel instant","designImplication":"Can design real-time position rebalancing UX"},{"aspect":"Complex Position Display","ethereum":"Querying multiple SFTs can be slow","monad":"Parallel execution speeds up portfolio queries","designImplication":"Can show larger portfolios without pagination"},{"aspect":"DeFi Integration","ethereum":"SFTs common for Uniswap V3 positions","monad":"Same patterns apply, potentially more complex positions viable","designImplication":"Design for sophisticated position management"}],"keyTakeaways":["ERC-3525 = NFT with a value (ID + amount)","Slot groups compatible tokens (same category)","Can split one token into two with divided value","Can transfer value between same-slot tokens","Always display both token ID and value"],"technicalNotes":"ERC-3525 adds slot (uint256) and value (uint256) to ERC-721. transferValueFrom moves value between tokens without changing ownership. Tokens in same slot are fungible with each other in terms of value. allowance() and approve() work on value, not token. Commonly used for Uniswap V3 LP positions, bonds, and financial instruments."},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-3525","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=ERC-3525","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/ERC-3525","markdown":"https://www.eipsfordesigners.com/standards/ERC-3525/content.md","agent":"https://www.eipsfordesigners.com/standards/ERC-3525/agent.md","api":"https://www.eipsfordesigners.com/api/standards/ERC-3525","official":"https://eips.ethereum.org/EIPS/eip-3525","discussion":"https://ethereum-magicians.org/search?q=ERC-3525"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}