LUKSO LSP0 ERC-725 Account Standard
The account contract. Owns assets, holds metadata, executes calls, accepts hooks.
// LSP0 composes ERC725X + ERC-725Y + LSP1 + LSP14 + LSP17
// ERC725X — execute arbitrary calls from the account
function execute(uint256 op, address target, uint256 value, bytes data)
external payable returns (bytes memory);
// ERC-725Y — typed key-value storage
function getData(bytes32 dataKey) external view returns (bytes memory);
function setData(bytes32 dataKey, bytes memory dataValue) external;
// LSP1 — universal receiver hook
function universalReceiver(bytes32 typeId, bytes memory data)
external payable returns (bytes memory);
LSP0 is the substrate every other account-side LSP builds on. The contract carries an ERC725X execute path (so the account can call out as itself), an ERC-725Y data store (so the account carries its own metadata), and an LSP1 hook (so the account can react when value or assets arrive). Owner rotation goes through LSP14’s two-step pattern, function-selector extension goes through LSP17, and permissioned execution typically goes through LSP6.
Read LSP0 as a kit, not a monolith. Each composed standard is independently described and independently swappable. The defaults are practical; the surface is small enough to audit.
What it solves.
- EOA single-key risk
- no standard account-level signature (vs ERC-1271)
- no standard place to store profile metadata
What it does not solve.
Anti-overselling is a feature.
- LSP0 isn't a wallet UX. The Universal Profile Browser Extension (or any LSP-aware wallet) is what users actually interact with.
- Bytecode is immutable. Behavior extension goes through LSP17, not in-place upgrades.
- The account doesn't pick controllers for you. That policy is the LSP6 layer.
Companions.
Standards this composes with.