Add LSP-33 (Music NFT Metadata), LSP-34 (Minting Delegation), and LSP-35 (Identifiable Digital Asset Entanglement)#319
Conversation
…ations LSP-33 defines a composable standard for music releases and tracks using LSP8 collections (releases) with LSP7 contracts (ownable track editions). Features transparent data routing between LSP8 and linked LSP7, structured music metadata (LSP33Metadata), industry standard integration (DDEX, ISRC), and contributor roles with Universal Profile linking. LSP-34 defines a generic mechanism for any ERC725Y contract to derive its owner from an external contract (LSP8 tokenOwnerOf or ERC173 owner), enabling ownership delegation without manual synchronization.
|
Reference implementation for both LSP-33 and LSP-34 is available at lukso-network/lsp-smart-contracts#1088. Includes:
Discussion: https://t.me/+PjX_Awnpjh8xYWE0 |
🔒 Security Audit — LSP-33 & LSP-34 SpecificationsScope
🟡 MEDIUM — LSP34 Ownership Clearing: Spec Says "SHOULD set local owner" But No Mechanism DefinedFile: LSP-34, The spec states: "When removed (set to empty bytes), the contract SHOULD fall back to the local owner variable. The local owner SHOULD be set to the last resolved external owner before clearing, to prevent ownership loss." However, there is no specified function or procedure for clearing
Recommendation: Specify a 🟡 MEDIUM — Write Forwarding Event AmbiguityFile: LSP-33, Data Routing Behavior, The spec says writes to
Recommendation: Add a note specifying event behavior. Either: (a) the LSP8 SHOULD emit 🟡 MEDIUM — Circular Ownership Resolution Depth Not Enforced in LSP-33 ContextFile: LSP-34, Security Considerations The spec says: "Implementations SHOULD set a maximum resolution depth of 1 hop." However, in the LSP-33 context, the resolution chain is: LSP7 → LSP8 → artist's UP. If the artist's UP itself uses LSP34 (e.g., a DAO-controlled profile), you get 2 hops: LSP7 → LSP8 → UP → DAO. The spec should clarify:
Recommendation: Clarify that 1 hop means the LSP34 contract makes exactly 1 external call. The resolved 🟢 LOW —
|
| Severity | Count | Key Issues |
|---|---|---|
| 🟡 MEDIUM | 3 | LSP34 clearing mechanism, event ambiguity, circular resolution depth |
| 🟢 LOW | 4 | Link immutability, transfer restrictions, metadata integrity, bytes32(0) ambiguity |
| ℹ️ INFO | 1 | Role extensibility vs indexer compatibility |
Both specifications are well-designed and compose existing LSP primitives effectively. The issues found are primarily around under-specified edge cases that should be clarified before moving from Draft to Review status.
LSP-33: - Add Event Behavior section (LSP8 does not emit TokenIdDataChanged for forwarded writes) - Require immutable parent collection cache in LSP7 requirements - Document parent collection auth uses cached immutable, not LSP8ReferenceContract - Add Address Encoding section (20-byte and 32-byte formats) LSP-34: - Clarify transferOwnership/renounceOwnership MUST (not SHOULD) fallback to ERC173 - Define 1-hop resolution depth precisely - Add bytes32(0) tokenId reservation note - Recommend immutable cache for source contract address - Improve source contract availability guidance (catch revert + fallback)
…wner - Access control: caller must be tokenOwnerOf(tokenId), consistent with LSP7/LSP34 - Updated flow diagram to show token-owner auth - LSP33OwnableTrackToken settable by tokenId owner - When track transfers, new owner controls metadata automatically
|
|
||
| _Requirements:_ | ||
|
|
||
| - MUST only be callable by the current owner of the specific `tokenId` (as returned by `tokenOwnerOf(tokenId)`), **not** the contract-level `owner()`. This is consistent with LSP7's access model, where `owner()` resolves to the same `tokenOwnerOf` result via LSP34. When a track is transferred, the new token owner automatically gains control over that track's metadata. |
There was a problem hiding this comment.
Design issue: Token Owners Can Overwrite Artist Metadata
The current design gives setDataForTokenId access to tokenOwnerOf(tokenId), meaning whoever owns a track NFT can overwrite all metadata — title, artists, ISRC, lyrics, copyright, contributors, etc.
When a track is transferred, the new token owner automatically gains control over that track's metadata.
This conflates two separate concerns:
- Edition control (minting, transferring LSP7 tokens) → should belong to token owner
- Creative metadata (song info, credits, identifiers) → should belong to the artist
Concrete scenario: Artist X releases Album Y with 12 tracks. Collector Z buys tokenId 1. Collector Z can now rename the track, change credited artists, overwrite the ISRC, and replace the lyrics. This breaks the trust model for music NFTs.
Proposed fix: Split authorization so that:
- setDataForTokenId requires the contract-level owner (artist), not the token owner
- LSP7 owner() still resolves via LSP34 for minting control only
- LSP7 setData is callable only by the parent LSP8 (artist-controlled), not by the resolved token owner
This preserves the elegant LSP34 ownership delegation for edition minting while keeping creative metadata under artist control.
There was a problem hiding this comment.
Because the idea is that owning the track is actually only done by the artist. If you want to own a track, the track should have an LSP7.
But I like the idea about using the owner only for minting.
Yeah, your two fixes are actually very good.
- Add Ownership Model section in Abstract with table and ASCII diagram - Clarify: LSP8 tokenId = artist ownership (authorship, metadata control) - Clarify: LSP7 units = collector ownership (tradeable copies, no metadata control) - Add complete Release metadata JSON example with all fields - Add complete Track metadata JSON example with all LSP33 fields (contributors, identifiers, copyright, lyrics, preview, stems, ddex) - Update Overview diagrams with ownership labels - Add 'Artist vs Collector Ownership' rationale section - Improve readability throughout Addresses feedback from PR review about artist/user ownership confusion.
- Default framing: separate files with separate data keys - Note that combining into one JSON is optional optimization - Split examples into 4 separate files (release LSP4, release LSP33, track LSP4, track LSP33) - Update all references from 'same JSON file' to 'separate data key'
Split conflated concerns and fix the authorization model: - LSP-33 becomes pure music metadata (LSP33Metadata schema, LSP4 attributes, AI classification fields, contributors, identifiers, etc.). No linking or routing logic. - LSP-34 grants only mint() rights to the resolved external address. The contract owner() stays as standard ERC173 — setData and ownership transfer remain restricted to the artist. Title renamed to "External Minting Rights". - LSP-35 (new) is "Identifiable Digital Asset Entanglement": a generic LSP8 <-> LSP7 linking standard with transparent metadata routing and bidirectional link verification. Data key renamed from LSP35OwnableTrackToken (music-specific) to LSP35OwnableToken (generic). setDataForTokenId is gated by the LSP8 contract owner() — NOT by tokenOwnerOf — so collectors who acquire a tokenId cannot rewrite the artist's metadata. The previous model let token owners overwrite artist metadata, which broke the artist-vs-collector separation. The new three-role model makes authorship (artist / contract owner), minting (LSP8 tokenId holder, via LSP34), and collectibility (LSP7 unit holders) cleanly independent.
|
Sick |
Summary
This PR introduces three LUKSO Standard Proposals that work together for music NFTs while remaining independently useful:
LSP-33: Music NFT Metadata (Pure Metadata Standard)
Defines the metadata schema for representing music releases and tracks:
LSP33Metadatadata key: Structured music metadata (contributors, industry identifiers, copyright, lyrics, preview, stems, DDEX references)category: Music, artist, release type, genre, etc.)audio_ai_usage,composition_ai_usage,commercial_samples, and per-contributorai_contributionfieldsLSP-34: Minting Delegation
A mechanism for delegating minting rights only to an external address:
LSP34MintingSource→(address, bytes32)tokenOwnerOf(tokenId)on the source LSP8owner()on the source contractowner()stays unchangedLSP-35: Identifiable Digital Asset Entanglement
Defines how an LSP8 collection can structurally link to LSP7 tokens:
LSP35OwnableTokendata key: Points from an LSP8 tokenId to a linked LSP7 contractgetDataForTokenId/setDataForTokenIdproxy to the linked LSP7LSP8ReferenceContractpointing backAuthorization Model (Critical Fix)
This architecture cleanly separates concerns:
Reference Implementation
See lukso-network/lsp-smart-contracts#1088 for LSP7MusicNFT and LSP8MusicNFT extension contracts.
Status: Draft
Authors: Fabian Vogelsteller fabian@universaleverything.io, Thomas Beard thomas@universaleverything.io
Discussion: https://t.me/+PjX_Awnpjh8xYWE0