🐦

Skip the Read

Get a quick 2-minute overview of IP Assets here.

IP Assets are the foundational programmable IP metadata on Story Protocol. Each IP Asset is an on-chain NFT (representing an IP) and its associated IP Account, which is a modified ERC-6551 (Token Bound Account) implementation. An IP Asset transforms a new or existing NFT like Azuki into a versatile and interactive IP entity.

IP Account

🐦

Skip the Read

Get a quick 2-minute overview of IP Accounts here.

This transformation is achieved through the use of ERC-6551's Token Bound Accounts, which assign every NFT a Story Protocol Bound Account (SPBA), known in implementation as an IP Account. They are created when an IP Asset is registered on Story Protocol and are assigned a unique ID. This ID is the address of the IP Account that is bound to the IP Asset.

These accounts, essentially smart contracts, are equipped to store comprehensive IP-related data, including metadata and ownership details of associated assets such as the License Tokens or Royalty Tokens that are created from the IP.

IP Account not only stores IP-related data but also facilitates the utilization of this data by various modules. These modules interact with and contribute to the IP Account, creating and storing data. For example, licensing, revenue/royalty sharing, remixing, disputing an IP, and other modules are made possible due to the IP Account's programmability.

One of the innovative features of IP Account is its approach to data sharing and standardization. It establishes a standardized method for storing and sharing data among modules based on namespaces. Each module is assigned its own namespace within the IP Account, wherein it has the autonomy to write data. Each module is granted the ability to freely read data from the namespaces of other modules.

Lastly, a key feature of IP Account is the generic execute() function, which allows calling arbitrary modules within Story Protocol via encoded bytes data (thus extensible for future modules). Additionally, there is executeWithSig() function that enables users to sign transactions and have others execute on their behalf for seamless UX.