Skip to main content

LSP1 Notification Type IDs

The LSP1 Type IDs listed below are unique identifiers used across the LSP standards for the Universal Receiver notification mechanism.

These Type IDs are sent as the typeId parameter when calling the universalReceiver(bytes32 typeId, bytes data) function on contracts implementing LSP1. They allow contracts to identify what type of notification they are receiving and react accordingly.

When a Universal Profile receives a notification, its Universal Receiver function (LSP1) is called with a typeId and data. A connected LSP1 Delegate inspects the typeId to decide how to react. For example:

  • Auto-register a received token / NFT in your list of received assets
  • Swap automatically a token received
  • Send a tip or an NFT to a new follower
  • Auto-split received LYX / LSP7 tokens between collaborators
  • Save a new follower to a subscriber list for future airdrops (NFT music tracks, vouchers, newsletter, etc...)
  • Any customisation you might want

Notification Type IDs list

Notification TypeTypeId valueDetails
When receiving native LYX (ERC725Account)LSP0ValueReceived
0x9c4705229491d365fb5434052e12a386d6771d976bea61070a8c694e8affea3d
When ownership transfer starts (ERC725Account)LSP0OwnershipTransferStarted
0xe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926
When previous owner is notified of ownership transfer (ERC725Account)LSP0OwnershipTransferred_SenderNotification
0xa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814
When new owner is notified of ownership transfer (ERC725Account)LSP0OwnershipTransferred_RecipientNotification
0xceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f995538
When sending LSP7 tokensLSP7Tokens_SenderNotification
0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea
When receiving LSP7 tokensLSP7Tokens_RecipientNotification
0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c
When an LSP7 operator is authorized or revokedLSP7Tokens_OperatorNotification
0x386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc
When sending an LSP8 NFTLSP8Tokens_SenderNotification
0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00
When receiving an LSP8 NFTLSP8Tokens_RecipientNotification
0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d
When an LSP8 operator is authorized or revokedLSP8Tokens_OperatorNotification
0x8a1c15a8799f71b547e08e2bcb2e85257e81b0a07eee2ce6712549eef1f00970
When receiving native LYX (Vault)LSP9ValueReceived
0x468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc
When ownership transfer starts (Vault)LSP9OwnershipTransferStarted
0xaefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f
When previous owner is notified of Vault ownership transferLSP9OwnershipTransferred_SenderNotification
0x0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471
When new owner is notified of Vault ownership transferLSP9OwnershipTransferred_RecipientNotification
0x79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c
When ownership transfer starts (Ownable2Step)LSP14OwnershipTransferStarted
0xee9a7c0924f740a2ca33d59b7f0c2929821ea9837ce043ce91c1823e9c4e52c0
When previous owner is notified of Ownable2Step transferLSP14OwnershipTransferred_SenderNotification
0xa124442e1cc7b52d8e2ede2787d43527dc1f3ae0de87f50dd03e27a71834f74c
When new owner is notified of Ownable2Step transferLSP14OwnershipTransferred_RecipientNotification
0xe32c7debcb817925ba4883fdbfc52797187f28f73f860641dab1a68d9b32902c
When someone follows youLSP26FollowerSystem_FollowNotification
0x71e02f9f05bcd5816ec4f3134aa2e5a916669537ec6c77fe66ea595fabc2d51a
When someone unfollows youLSP26FollowerSystem_UnfollowNotification
0x9d3c0b4012b69658977b099bdaa51eff0f0460f421fba96d15669506c00d1c4f

Using Type ID

Recommendation

It is recommended to import each notification type ID from the @lukso/lsp-smart-contracts package to ensure the logic of your dApp or smart contract checks against the correct Type ID values.

The JavaScript constants are exported from the @lukso/lsp-smart-contracts package.

import { LSP1_TYPE_IDS } from '@lukso/lsp-smart-contracts';

// Type ID for receiving native tokens (LYX)
LSP1_TYPE_IDS.LSP0ValueReceived;

// Type ID for receiving LSP7 tokens
LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification;

// Type ID for follow notifications
LSP1_TYPE_IDS.LSP26FollowerSystem_FollowNotification;
How Type IDs are generated

Each Type ID is a bytes32 value computed as the keccak256 hash of the Type ID name string. For example:

keccak256("LSP7Tokens_SenderNotification") = 0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea

You can verify any Type ID by hashing its name:

import { keccak256, toUtf8Bytes } from 'ethers'; // ethers v6
const typeId = keccak256(toUtf8Bytes('LSP7Tokens_SenderNotification'));

LSP0 - ERC725 Account

LSP0ValueReceived

Name"LSP0ValueReceived"
TypeID0x9c4705229491d365fb5434052e12a386d6771d976bea61070a8c694e8affea3d
TypeID generationkeccak256("LSP0ValueReceived")
Used in:constructor(address), receive(), fallback(bytes), execute(uint256,address,uint256,bytes), executeBatch(uint256[],address[],uint256[],bytes[]), setData(bytes32,bytes), setDataBatch(bytes32[],bytes[])
Solidity constant:_TYPEID_LSP0_VALUE_RECEIVED
JavaScript constant:LSP1_TYPE_IDS.LSP0ValueReceived

No additional data is sent with this notification (empty bytes "").

LSP0OwnershipTransferStarted

Name"LSP0OwnershipTransferStarted"
TypeID0xe17117c9d2665d1dbeb479ed8058bbebde3c50ac50e2e65619f60006caac6926
TypeID generationkeccak256("LSP0OwnershipTransferStarted")
Used in:transferOwnership(address)
Solidity constant:_TYPEID_LSP0_OwnershipTransferStarted
JavaScript constant:LSP1_TYPE_IDS.LSP0OwnershipTransferStarted
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [currentOwner, pendingNewOwner] = abiCoder.decode(
['address', 'address'],
data,
);

LSP0OwnershipTransferred_SenderNotification

Name"LSP0OwnershipTransferred_SenderNotification"
TypeID0xa4e59c931d14f7c8a7a35027f92ee40b5f2886b9fdcdb78f30bc5ecce5a2f814
TypeID generationkeccak256("LSP0OwnershipTransferred_SenderNotification")
Used in:acceptOwnership()
renounceOwnership()
Solidity constant:_TYPEID_LSP0_OwnershipTransferred_SenderNotification
JavaScript constant:LSP1_TYPE_IDS.LSP0OwnershipTransferred_SenderNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);
// newOwner is address(0) on renounceOwnership

LSP0OwnershipTransferred_RecipientNotification

Name"LSP0OwnershipTransferred_RecipientNotification"
TypeID0xceca317f109c43507871523e82dc2a3cc64dfa18f12da0b6db14f6e23f995538
TypeID generationkeccak256("LSP0OwnershipTransferred_RecipientNotification")
Used in:acceptOwnership()
Solidity constant:_TYPEID_LSP0_OwnershipTransferred_RecipientNotification
JavaScript constant:LSP1_TYPE_IDS.LSP0OwnershipTransferred_RecipientNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);

LSP7 - Digital Asset

LSP7Tokens_SenderNotification

Name"LSP7Tokens_SenderNotification"
TypeID0x429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea
TypeID generationkeccak256("LSP7Tokens_SenderNotification")
Used in:_burn(address,uint256,bytes),
_transfer(address,address,uint256,bool,bytes)
Solidity constant:_TYPEID_LSP7_TOKENSSENDER
JavaScript constant:LSP1_TYPE_IDS.LSP7Tokens_SenderNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [operator, from, to, amount, transferData] = abiCoder.decode(
['address', 'address', 'address', 'uint256', 'bytes'],
data,
);
// `to` is address(0) when burning

LSP7Tokens_RecipientNotification

Name"LSP7Tokens_RecipientNotification"
TypeID0x20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c
TypeID generationkeccak256("LSP7Tokens_RecipientNotification")
Used in:_mint(address,uint256,bool,bytes),
_transfer(address,address,uint256,bool,bytes)
Solidity constant:_TYPEID_LSP7_TOKENSRECIPIENT
JavaScript constant:LSP1_TYPE_IDS.LSP7Tokens_RecipientNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [operator, from, to, amount, transferData] = abiCoder.decode(
['address', 'address', 'address', 'uint256', 'bytes'],
data,
);
// `from` is address(0) when minting

LSP7Tokens_OperatorNotification

Name"LSP7Tokens_OperatorNotification"
TypeID0x386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc
TypeID generationkeccak256("LSP7Tokens_OperatorNotification")
Used in:authorizeOperator(address,uint256,bytes), revokeOperator(address,bool,bytes), increaseAllowance(address,uint256,bytes), decreaseAllowance(address,uint256,bytes)
Solidity constant:_TYPEID_LSP7_TOKENOPERATOR
JavaScript constant:LSP1_TYPE_IDS.LSP7Tokens_OperatorNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [tokenOwner, allowance, operatorNotificationData] = abiCoder.decode(
['address', 'uint256', 'bytes'],
data,
);
// allowance is 0 on revokeOperator

LSP8 - Identifiable Digital Asset

LSP8Tokens_SenderNotification

Name"LSP8Tokens_SenderNotification"
TypeID0xb23eae7e6d1564b295b4c3e3be402d9a2f0776c57bdf365903496f6fa481ab00
TypeID generationkeccak256("LSP8Tokens_SenderNotification")
Used in:_burn(bytes32,bytes),
_transfer(address,address,bytes32,bool,bytes)
Solidity constant:_TYPEID_LSP8_TOKENSSENDER
JavaScript constant:LSP1_TYPE_IDS.LSP8Tokens_SenderNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [operator, from, to, tokenId, transferData] = abiCoder.decode(
['address', 'address', 'address', 'bytes32', 'bytes'],
data,
);
// `to` is address(0) when burning

LSP8Tokens_RecipientNotification

Name"LSP8Tokens_RecipientNotification"
TypeID0x0b084a55ebf70fd3c06fd755269dac2212c4d3f0f4d09079780bfa50c1b2984d
TypeID generationkeccak256("LSP8Tokens_RecipientNotification")
Used in:_mint(address,bytes32,bool,bytes),
_transfer(address,address,bytes32,bool,bytes)
Solidity constant:_TYPEID_LSP8_TOKENSRECIPIENT
JavaScript constant:LSP1_TYPE_IDS.LSP8Tokens_RecipientNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [operator, from, to, tokenId, transferData] = abiCoder.decode(
['address', 'address', 'address', 'bytes32', 'bytes'],
data,
);
// `from` is address(0) when minting

LSP8Tokens_OperatorNotification

Name"LSP8Tokens_OperatorNotification"
TypeID0x8a1c15a8799f71b547e08e2bcb2e85257e81b0a07eee2ce6712549eef1f00970
TypeID generationkeccak256("LSP8Tokens_OperatorNotification")
Used in:authorizeOperator(address,bytes32,bytes), revokeOperator(address,bytes32,bool,bytes)
Solidity constant:_TYPEID_LSP8_TOKENOPERATOR
JavaScript constant:LSP1_TYPE_IDS.LSP8Tokens_OperatorNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [tokenOwner, tokenId, authorized, operatorNotificationData] =
abiCoder.decode(['address', 'bytes32', 'bool', 'bytes'], data);
// authorized = true on authorizeOperator, false on revokeOperator

LSP9 - Vault

LSP9ValueReceived

Name"LSP9ValueReceived"
TypeID0x468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc
TypeID generationkeccak256("LSP9ValueReceived")
Used in:constructor(address), receive(), fallback(bytes), execute(uint256,address,uint256,bytes), executeBatch(uint256[],address[],uint256[],bytes[])
Solidity constant:_TYPEID_LSP9_VALUE_RECEIVED
JavaScript constant:LSP1_TYPE_IDS.LSP9ValueReceived

No additional data is sent with this notification (empty bytes "").

LSP9OwnershipTransferStarted

Name"LSP9OwnershipTransferStarted"
TypeID0xaefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f
TypeID generationkeccak256("LSP9OwnershipTransferStarted")
Used in:transferOwnership(address)
Solidity constant:_TYPEID_LSP9_OwnershipTransferStarted
JavaScript constant:LSP1_TYPE_IDS.LSP9OwnershipTransferStarted
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [currentOwner, pendingNewOwner] = abiCoder.decode(
['address', 'address'],
data,
);

LSP9OwnershipTransferred_SenderNotification

Name"LSP9OwnershipTransferred_SenderNotification"
TypeID0x0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471
TypeID generationkeccak256("LSP9OwnershipTransferred_SenderNotification")
Used in:acceptOwnership()
renounceOwnership()
Solidity constant:_TYPEID_LSP9_OwnershipTransferred_SenderNotification
JavaScript constant:LSP1_TYPE_IDS.LSP9OwnershipTransferred_SenderNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);
// newOwner is address(0) on renounceOwnership

LSP9OwnershipTransferred_RecipientNotification

Name"LSP9OwnershipTransferred_RecipientNotification"
TypeID0x79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c
TypeID generationkeccak256("LSP9OwnershipTransferred_RecipientNotification")
Used in:acceptOwnership()
Solidity constant:_TYPEID_LSP9_OwnershipTransferred_RecipientNotification
JavaScript constant:LSP1_TYPE_IDS.LSP9OwnershipTransferred_RecipientNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);

LSP14 - Ownable 2-Step

LSP14OwnershipTransferStarted

Name"LSP14OwnershipTransferStarted"
TypeID0xee9a7c0924f740a2ca33d59b7f0c2929821ea9837ce043ce91c1823e9c4e52c0
TypeID generationkeccak256("LSP14OwnershipTransferStarted")
Used in:transferOwnership(address)
Solidity constant:_TYPEID_LSP14_OwnershipTransferStarted
JavaScript constant:LSP1_TYPE_IDS.LSP14OwnershipTransferStarted
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [currentOwner, pendingNewOwner] = abiCoder.decode(
['address', 'address'],
data,
);

LSP14OwnershipTransferred_SenderNotification

Name"LSP14OwnershipTransferred_SenderNotification"
TypeID0xa124442e1cc7b52d8e2ede2787d43527dc1f3ae0de87f50dd03e27a71834f74c
TypeID generationkeccak256("LSP14OwnershipTransferred_SenderNotification")
Used in:acceptOwnership()
renounceOwnership()
Solidity constant:_TYPEID_LSP14_OwnershipTransferred_SenderNotification
JavaScript constant:LSP1_TYPE_IDS.LSP14OwnershipTransferred_SenderNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);
// newOwner is address(0) on renounceOwnership

LSP14OwnershipTransferred_RecipientNotification

Name"LSP14OwnershipTransferred_RecipientNotification"
TypeID0xe32c7debcb817925ba4883fdbfc52797187f28f73f860641dab1a68d9b32902c
TypeID generationkeccak256("LSP14OwnershipTransferred_RecipientNotification")
Used in:acceptOwnership()
Solidity constant:_TYPEID_LSP14_OwnershipTransferred_RecipientNotification
JavaScript constant:LSP1_TYPE_IDS.LSP14OwnershipTransferred_RecipientNotification
How to decode notification data?
import { AbiCoder } from 'ethers';

const abiCoder = new AbiCoder();
const [previousOwner, newOwner] = abiCoder.decode(['address', 'address'], data);

LSP26 - Follower System

LSP26FollowerSystem_FollowNotification

Name"LSP26FollowerSystem_FollowNotification"
TypeID0x71e02f9f05bcd5816ec4f3134aa2e5a916669537ec6c77fe66ea595fabc2d51a
TypeID generationkeccak256("LSP26FollowerSystem_FollowNotification")
Used in:follow(address) — notifies the followed address that they have a new follower
Solidity constant:_TYPEID_LSP26_FOLLOW
JavaScript constant:LSP1_TYPE_IDS.LSP26FollowerSystem_FollowNotification
How to decode notification data?

Note: LSP26 uses abi.encodePacked (not abi.encode), so the data is 20 bytes (the raw address) rather than 32 bytes (ABI-padded).

import { dataSlice, getAddress } from 'ethers';

// data is 20 bytes (not ABI-padded)
const follower = getAddress(dataSlice(data, 0, 20));

LSP26FollowerSystem_UnfollowNotification

Name"LSP26FollowerSystem_UnfollowNotification"
TypeID0x9d3c0b4012b69658977b099bdaa51eff0f0460f421fba96d15669506c00d1c4f
TypeID generationkeccak256("LSP26FollowerSystem_UnfollowNotification")
Used in:unfollow(address) — notifies the unfollowed address that they lost a follower
Solidity constant:_TYPEID_LSP26_UNFOLLOW
JavaScript constant:LSP1_TYPE_IDS.LSP26FollowerSystem_UnfollowNotification
How to decode notification data?

Note: LSP26 uses abi.encodePacked (not abi.encode), so the data is 20 bytes (the raw address) rather than 32 bytes (ABI-padded).

import { dataSlice, getAddress } from 'ethers';

// data is 20 bytes (not ABI-padded)
const unfollower = getAddress(dataSlice(data, 0, 20));

See also