standard · token

LUKSO LSP8 Identifiable Digital Asset Standard

LSP·8 · Token

NFTs and identifiable items. bytes32 IDs, per-token ERC-725Y data, LSP1 hooks.

LSP·8 interface solidity
function tokenOwnerOf(bytes32 tokenId) external view returns (address);

function transfer(
  address from,
  address to,
  bytes32 tokenId,
  bool force,
  bytes calldata data
) external;

// Per-token metadata via ERC-725Y-on-tokenId
function getDataForTokenId(bytes32 tokenId, bytes32 dataKey)
  external view returns (bytes memory);

function setDataForTokenId(bytes32 tokenId, bytes32 dataKey, bytes calldata dataValue)
  external;

LSP8 makes one structural change to ERC-721: token IDs are bytes32, not uint256. The integer case still works — cast and proceed. The new cases (content hashes, encoded serials, structured references) become first-class instead of side mappings.

The other meaningful add is getDataForTokenId(tokenId, key). Per-token metadata is a typed key-value store, not a URL. Dynamic updates are setData calls; trust comes from whoever has permission to make them (LSP6); off-chain media still works (with VerifiableURI when you want integrity).

What it solves.

What it does not solve.

Anti-overselling is a feature.

  • LSP8 doesn't make off-chain media verifiable on its own — use VerifiableURI in LSP4 when you need integrity.
  • Publishes distinct function selectors from ERC-721. Code that hardcodes ERC-721's ABI won't accidentally dispatch to LSP8.
  • bytes32 IDs are powerful but require schema discipline — pick the encoding once; it's part of the contract's permanent interface.
  • Per-token ERC-725Y data is storage. Frequent mutation costs gas; decide which fields are mutable deliberately.

Companions.

Standards this composes with.

Read the source.